Как создать систему «событий» для получения пакетов - PullRequest
1 голос
/ 21 октября 2019

Итак, я работал над несколькими сетевыми программами на c ++ и столкнулся с проблемой. Я использую Winsock (версия 2) для этого, понятия не имею, лучше ли это использовать, но что угодно. Таким образом, в winsock есть функция для получения пакета (фактически 2 функции), и она ждет, пока не получит пакет, а затем продолжает работу, останавливая программу во время ожидания пакета. Мне кажется, что мне нужна какая-то система «событий», в которой есть функция, которая вызывается каждый раз, когда приходит пакет, и программа продолжает работать в ожидании пакета.

Так что, по сути, прямо сейчас, еслиЯ просто хочу напечатать (tcp) пакеты, которые я получаю, у меня есть это (сначала некоторый код запуска и создание сокетов и прочее):

char buffer[4096];

while(true){

    ZeroMemory(buffer, 4096);

    recv(clientSocket, buffer, 4096, 0); //Program freezes until it receives something

    std::cout << buffer << std::endl;

}

Но что, если у меня есть окно, которое я хочуобновлять во время ожидания пакета? Программа просто собирается зависнуть.

1 Ответ

2 голосов
/ 21 октября 2019

WinSock предлагает несколько управляемых событиями моделей для неблокирующих операций с сокетами:

  • WSAAsyncSelect(). Это было бы самым простым способом включить в существующий код, так как у вас уже есть окно пользовательского интерфейса. Вы можете зарегистрировать HWND с помощью SOCKET, а затем добавить дополнительный обработчик сообщений окна для обработки событий сокета, отправляемых на HWND.

  • Перекрытый I /O или Порты завершения ввода / вывода . Вы можете передать WSAOVERLAPPED структуры или функции обратного вызова в WSARecv() и WSASend(), и вы можете опросить статусы операций с помощью WSAGetOverlappedResult() или GetQueuedCompletionStatus() в таймере или потоке.

...