Russian Qt Forum
Ноябрь 23, 2024, 21:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка старых сокетов  (Прочитано 3215 раз)
Zizilk
Гость
« : Июль 29, 2010, 14:07 »

Не пойму как можно организовать обработку старых сокетов. Непонимающий

Пока удаётся при появлении нового сокета засовывать его декриптор в вектор.

А вот как дальше организовать обработку не знаю(

Пока думаю, что придётся организовывать два цикла
Первый - бесконечный в котором идёт обработка данных. Второй вложенный, в котором пробегается по старым сокетам в векторе и обрабатывает полученные данные.  Непонимающий

Но чуствую, что что-то я не понимаю, как всё организовать.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Июль 29, 2010, 15:46 »

Цитировать
Пока удаётся при появлении нового сокета засовывать его декриптор в вектор.
Ненене.. Как вариант - засовывать указатель на вновь созданный объект сокет (не дескриптор сокета - а именно сокет!!!) например в
QList<QTCPSocket *> .

Цитировать
А вот как дальше организовать обработку не знаю(

Пока думаю, что придётся организовывать два цикла
Первый - бесконечный в котором идёт обработка данных. Второй вложенный, в котором пробегается по старым сокетам в векторе и обрабатывает полученные данные.  Непонимающий

А в чем проблема конкретно то? У тебя есть к примеру (грубо) список QList<QTCPSocket *> с указателями на сокеты. Вот берешь нужный тебе указатель и делаешь с ним I/O! В чем загвоздка? Что вообще хочешь сделать? Код в студию! Улыбающийся

Да и "старых" сокетов в принципе не бывет. После получения сигнала disconnected() ты должен удалить сокет вообще.

И вообще все зависит от того, какой стратегии ты придерживаешься.. Я ж тебе уже раньше писал об этом.
« Последнее редактирование: Июль 29, 2010, 15:51 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Zizilk
Гость
« Ответ #2 : Июль 29, 2010, 16:33 »

ну я так и делаю в принципе..
Код:
std::vector<QTcpSocket*>onlineusers;

------------------------------------------------
void Server::newuser()
{
    printf("Incoming connection \n");
    QTcpSocket* Clientsocket=tcpServer->nextPendingConnection();
    printf("Connected \n");
    connect(Clientsocket,SIGNAL(disconnected()),Clientsocket,SLOT(deleteLater()));
    Clientsocket->write("Hi",2);//Clientsocket->flush();
    printf("Send to client \n");
    onlineusers.push_back(Clientsocket);
    printf("Wellcome new user \n");
}
...
Придерживаюсь таки варианта с сигналом NewConnection



Кода есть но немного, и в принципе мне за него немного стыдно Обеспокоенный

Ну под старыми сокетами я подразумевал те которые уже есть в векторе.)
А задача стоит чтобы сервер не требовалось после каждого диалога рвать соединение.
А использовать уже занесёные в вектор сокеты.

Щас пробую делать нечто вроде эхосервера, который бы конектился с клиентом написанным на PHP. Те клиент подключается к серверу, отправляет серверу сообщение, сервер возвращает его клиенту, и так продолжается пока клиент не отсоединится. При этом работаем с одним сокетом.

Единственное пока удалось только подключать сервер. А как вот реализовать дальнейшую возможность общения через один сокет, когда будет несколько подключённых клиентов, не могу придумать.


Щас вот ещё узнал про сигнал ReadyToRead может вместо циклов его использовать
« Последнее редактирование: Июль 29, 2010, 16:35 от Zizilk » Записан
Zizilk
Гость
« Ответ #3 : Июль 31, 2010, 00:09 »

Почти разобрался, делаю через ReadyToRead()

Но возникла проблема(

Не могу добраться, до того, что передал мне клиент.
Сокет открывается. в сокет записывается.
Но при попытке вывести на печать выдаёт null

Код:
printf("Reciving\n");
QTcpSocket*  ClientSocket=(QTcpSocket*)sender();
QDataStream in(ClientSocket);
Char* str;
in>>str;
printf("Recived %s",str);

Тут опущена закоменченная проверка на целостность блока
И проверка кол-ва байт находящихся в сокете (приходит в сокет ровно столько сколько пришло из клиента, так что затык именно где-то в обработке сокета...)

Я не знаю где ошибка(
Записан
Lostinnet
Гость
« Ответ #4 : Август 02, 2010, 15:58 »

попробуй использовать не указатель на Char, а QString. У меня все отлично работает
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.