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,所以我将使用前者。谢谢