【问题标题】:How to create an "event" system for recieving packets如何创建用于接收数据包的“事件”系统
【发布时间】:2019-10-21 17:01:26
【问题描述】:

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

}

但是,如果我有一个窗口要在等待数据包时不断更新呢?程序即将冻结。

【问题讨论】:

  • 一个单独的线程等待数据包怎么样?
  • 你想看看select()。这个函数允许你在不阻塞线程的情况下检查一个或多个套接字是否需要注意。

标签: c++ networking winsock winsock2


【解决方案1】:

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

【讨论】:

  • OP 没有指定它在 Windows 上,但如果是,WSAASyncSelect() 确实非常方便。
  • @Havenard OP 说“我使用 Winsock”——这仅适用于 Windows
  • 我大部分时间都使用WSAEventSelect 进行非阻塞套接字 I/O。我发现它特别有用,因为事件对象不仅限于WSAWaitForMultipleEvents,还可以与更通用的WaitForMultipleObjects 函数一起使用。但是如果你想要窗口消息,WSAAsyncSelect 会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多