Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Winsock—从套接字读取、写入、发送和接收数据的最佳方式_C++_Sockets_Networking_Winsock_Winsock2 - Fatal编程技术网

C++ Winsock—从套接字读取、写入、发送和接收数据的最佳方式

C++ Winsock—从套接字读取、写入、发送和接收数据的最佳方式,c++,sockets,networking,winsock,winsock2,C++,Sockets,Networking,Winsock,Winsock2,在单个线程上读取和写入多个客户端套接字的最佳方式是什么?我听说select()。当前使用WSAAsyncSelect,WSAEventSelect中的一种是最佳选项吗 另外,WSARecv()和recv(),以及WSASend()和send()之间有什么区别?WSA版本是否是通过winsock发送和接收数据的最现代方式?如果您的单个线程也在实现GUI,那么WSAAsyncSelect就是为此目的而设计的:您可以通过Windows队列中的消息获得套接字通知,而您的GUI线程无论如何都必须提供服务

在单个线程上读取和写入多个客户端套接字的最佳方式是什么?我听说
select()。当前使用
WSAAsyncSelect
WSAEventSelect
中的一种是最佳选项吗


另外,
WSARecv()
recv()
,以及
WSASend()
send()
之间有什么区别?WSA版本是否是通过winsock发送和接收数据的最现代方式?

如果您的单个线程也在实现GUI,那么WSAAsyncSelect就是为此目的而设计的:您可以通过Windows队列中的消息获得套接字通知,而您的GUI线程无论如何都必须提供服务


如果您的单个线程专用于套接字,并且不需要消息循环,那么WSAEventSelect可能会更方便、更快一些

最好的选择通常是放弃对单个线程的需求,使用基于事件的模型。所有较新的网络库(如boost)都支持该功能。如果不需要这样的库,请使用IOCP.send()/WSASend()和recv()/WSARecv()作为别名。它们是几十年前定义的。它们都不是最“现代”的。谢谢,非常感谢@EJP:它们不是任何东西的别名。它们有自己独特的功能
WSASend()
WSARecv()
是WinSock2提供的扩展(因此无法移植到其他平台),它们支持I/O完成端口,这是在Windows上编写可伸缩套接字代码的最佳方式,因此它们是“现代的”。谢谢Remy,我将介绍完成端口。哦,好的。我使用Opengl作为我的GUI,所以我将使用前者。谢谢