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