Сделайте оба recv () и send () winsock - PullRequest
0 голосов
/ 03 января 2012

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

Я подумал, что могу сделать многопоточность, но информация, которую я нашел до сих пор, была просто о потоке с беспокойством о клиентезапросы (обойти клиентскую вещь вещь).Я абсолютно не пробовал многопоточность раньше.Я также не знаю, единственный ли это способ.Я также хотя и делал что-то управляемое событиями, но я не мог заставить ncurses работать на VS (он успешно скомпилирован и скомпилирован, но, похоже, что-то не так в самой библиотеке).программа чата и не по очереди.В конце концов, вызов recv () удерживается до тех пор, пока он не получит что-то, поэтому в течение этого времени я не могу вызывать никакие функции stdin.

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Используйте цикл обработки событий.

1) Что-нибудь случилось?

2) Если это так, обработайте его.

3) Если нет, подождите, чтобы что-то произошлоили на определенное время.

4) Перейдите к шагу 1.

Теперь вам нужно просто сделать все, что может произойти (например, данные, полученные в сокет), событиемчто вы можете ждать в шаге 3. Для сокетов вы делаете это с WSAEventSelect .Вы можете ожидать события с помощью WaitForMultipleEvents .

В качестве альтернативы вы можете настроить Winsock на отправку вашей программе сообщения Windows при получении данных по сокету с WSAAsyncSelect .

0 голосов
/ 03 января 2012

Прежде чем позвонить в recv, проверьте, доступны ли данные.Вы можете использовать выбор или опрос, чтобы использовать это.См. Ссылку для выбора и, возможно, winsock FAQ .

...