如何创建用于接收数据包的“事件”系统

问题描述 投票:0回答:1

所以我一直在研究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;

}

但是如果我有一个窗口想在等待数据包时不断更新怎么办?该程序将被冻结。

c++ networking winsock winsock2
1个回答
0
投票

WinSock为非阻塞套接字操作提供了几种事件驱动的模型:

  • WSAAsyncSelect()。由于您已经具有UI窗口,因此这是合并到现有代码中的最简单方法。您可以在WSAAsyncSelect()中注册HWND,然后添加一个附加的窗口消息处理程序,以处理发送到SOCKET的套接字事件。

  • HWNDOverlapped I/O。您可以将I/O Completion Ports结构或回调函数传递给WSAOVERLAPPEDWSARecv(),并且可以在计时器或线程中通过WSARecv()WSASend()轮询操作状态。

© www.soinside.com 2019 - 2024. All rights reserved.