我正在寻找有关在重复的WSA套接字上同时发送时会发生什么情况的一些信息?这样安全吗?您能指出我任何特定的文档吗?
我是否需要在整个流程中使用某种消息来告知哪个活动对于发送是活动的?我认为我必须这样做才能收到。
谁能给我一个例子说明这部分文档的含义吗?
共享套接字上的通知受WSAAsyncSelect和WSAEventSelect的通常约束。使用任何共享描述符发出这些调用中的任何一个都会取消套接字的任何先前事件注册,无论使用哪个描述符进行该注册。因此,共享套接字无法将FD_READ事件传递给进程A,而将FD_WRITE事件传递给进程B。对于需要这种紧密协调的情况,建议开发人员使用线程而不是单独的进程。
最佳答案
如documentation所述:
引用共享套接字的描述符可以独立用于I / O。但是,Windows套接字接口没有实现任何类型的访问控制,因此取决于所涉及的进程来协调它们在共享套接字上的操作。共享套接字通常用于拥有一个负责创建套接字和建立连接的进程,以及另一个负责信息交换的进程。
如果您有两个进程同时在一个共享套接字上发送,它们将彼此重叠。就像单个进程中的两个线程同时发送到同一套接字一样。因此,您需要协调发送以避免重叠。例如,您可以为此使用一个共享的名为互斥体。
至于您询问的报价,如果您阅读了相关文档,则应该不言自明:WSAAsyncSelect()
function
为套接字发出WSAAsyncSelect会取消同一套接字的所有先前的WSAAsyncSelect或WSAEventSelect。例如,要接收读写通知,应用程序必须同时使用FD_READ和FD_WRITE调用WSAAsyncSelect,如下所示:
rc = WSAAsyncSelect(s,hWnd,wMsg,FD_READ | FD_WRITE);
无法为不同的事件指定不同的消息。以下代码不起作用;第二个调用将取消第一个调用的效果,并且仅FD_WRITE事件将通过消息wMsg2报告:
rc = WSAAsyncSelect(s,hWnd,wMsg1,FD_READ);
rc = WSAAsyncSelect(s,hWnd,wMsg2,FD_WRITE);WSAEventSelect()
function
为套接字发出WSAEventSelect会取消同一套接字的任何先前的WSAAsyncSelect或WSAEventSelect并清除内部网络事件记录。例如,要将事件对象与读取和写入网络事件相关联,应用程序必须同时使用FD_READ和FD_WRITE调用WSAEventSelect,如下所示:
rc = WSAEventSelect(s,hEventObject,FD_READ | FD_WRITE);
无法为不同的网络事件指定不同的事件对象。以下代码不起作用;第二个调用将取消第一个调用的效果,并且只有FD_WRITE网络事件将与hEventObject2关联:
rc = WSAEventSelect(s,hEventObject1,FD_READ);
rc = WSAEventSelect(s,hEventObject2,FD_WRITE); //坏
因此,如果让进程S
与进程A
和B
共享套接字,则A
不能监听FD_READ
事件,而B
监听FD_WRITE
事件,反之亦然。这是一个全有或全无的交易。
关于c++ - 在WSADuplicateSocket上发送多条消息时会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26186600/