的文档AcceptEx() says:
当此操作成功完成后,sAcceptSocket 可以
已通过,但仅限以下功能:
- ReadFile
- 写文件
- send
- WSASend
- recv
- WSARecv
- 传输文件
- 封闭式插座
- setsockopt(仅适用于SO_UPDATE_ACCEPT_CONTEXT)
请注意shutdown()不在列表中。确实,调用shutdown(sAcceptSocket, SD_SEND)
回报SOCKET_ERROR
and WSAGetLastError()
产生错误WSAENOTCONN
:
发送或接收数据的请求被禁止,因为套接字未连接并且(使用 sendto 调用在数据报套接字上发送时)未提供地址。
为什么不能关闭通过以下方式连接的套接字AcceptEx()
?另外,为什么套接字没有显示为已连接,因为它已经在接收数据(重叠操作已完成,完成通知表明某些size>0
收到字节)?
你必须打电话setsockopt(SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT)
after AcceptEx()
完成。接受的套接字并不与侦听套接字的属性完全关联,因此不会处于完全连接状态,直到SO_UPDATE_ACCEPT_CONTEXT
已设置。一些 winsock API 函数受此影响,包括getpeername()
, getsockname()
and shutdown()
.
如果你使用ConnectEx()
要建立出站连接,您必须调用setsockopt(SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT)
after ConnectEx()
在您可以使用之前完成shutdown()
。这是记录的行为在 MSDN 上。它并没有说同样的话AcceptEx()
and SO_UPDATE_ACCEPT_CONTEXT
, but shutdown()
对于接受的套接字确实有类似的限制AcceptEx()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)