所以我一直在研究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;
}
但是,如果我有一个窗口想在等待数据包时不断更新怎么办?该程序将被冻结。
答案 0 :(得分:2)
WinSock为非阻塞套接字操作提供了几种事件驱动模型:
WSAAsyncSelect()
。由于您已经具有UI窗口,因此这是合并到现有代码中的最简单方法。您可以向HWND
注册SOCKET
,然后添加一个附加的窗口消息处理程序,以处理发送到HWND
的套接字事件。
Overlapped I/O或I/O Completion Ports。您可以将WSAOVERLAPPED
结构或回调函数传递给WSARecv()
和WSASend()
,并且可以在计时器或线程中通过WSAGetOverlappedResult()
或GetQueuedCompletionStatus()
轮询操作状态。 / p>