如何创建一个 "event" 系统来接收数据包
How to create an "event" system for recieving packets
所以我一直在使用 C++ 编写一些不同的网络程序,但遇到了一个问题。我为此使用 Winsock(版本 2),不知道这是否是最好的使用方式,但无论如何。所以在 winsock 中有一个接收数据包的函数(实际上是 2 个函数),它所做的是等待直到它收到一个数据包然后继续运行,在等待数据包时冻结程序。我认为我需要的是某种 "event" 系统,其中有一个函数,每次数据包进入时都会调用该函数,程序在等待数据包时保持 运行。
所以基本上现在如果我只想打印我收到的 (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;
}
但是,如果我有一个 window 想要在等待数据包时继续更新怎么办?该程序即将冻结。
WinSock 为非阻塞套接字操作提供了几种事件驱动模型:
WSAAsyncSelect()
。这将是合并到现有代码中的最简单方法,因为您已经有了 UI window。您可以使用 SOCKET
注册您的 HWND
,然后添加一个额外的 window 消息处理程序来处理发送到 HWND
.
[=30 的套接字事件=]
Overlapped I/O or I/O Completion Ports. You can pass WSAOVERLAPPED
structs or callback functions to WSARecv()
and WSASend()
, and you can poll operation statuses via WSAGetOverlappedResult()
or GetQueuedCompletionStatus()
在计时器或线程中。
所以我一直在使用 C++ 编写一些不同的网络程序,但遇到了一个问题。我为此使用 Winsock(版本 2),不知道这是否是最好的使用方式,但无论如何。所以在 winsock 中有一个接收数据包的函数(实际上是 2 个函数),它所做的是等待直到它收到一个数据包然后继续运行,在等待数据包时冻结程序。我认为我需要的是某种 "event" 系统,其中有一个函数,每次数据包进入时都会调用该函数,程序在等待数据包时保持 运行。
所以基本上现在如果我只想打印我收到的 (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;
}
但是,如果我有一个 window 想要在等待数据包时继续更新怎么办?该程序即将冻结。
WinSock 为非阻塞套接字操作提供了几种事件驱动模型:
[=30 的套接字事件=]WSAAsyncSelect()
。这将是合并到现有代码中的最简单方法,因为您已经有了 UI window。您可以使用SOCKET
注册您的HWND
,然后添加一个额外的 window 消息处理程序来处理发送到HWND
.Overlapped I/O or I/O Completion Ports. You can pass
WSAOVERLAPPED
structs or callback functions toWSARecv()
andWSASend()
, and you can poll operation statuses viaWSAGetOverlappedResult()
orGetQueuedCompletionStatus()
在计时器或线程中。