AcceptEx()
的文档说:
注意 shutdown()
不在列表中。实际上,调用shutdown(sAcceptSocket, SD_SEND)
会返回SOCKET_ERROR
,而WSAGetLastError()
会产生错误WSAENOTCONN
:
为什么不能关闭通过AcceptEx()
连接的套接字?另外,为什么套接字没有显示为已连接状态,因为它已经在接收数据(重叠的操作已经完成,并且完成通知指示已接收到一些size>0
字节)?
最佳答案
setsockopt(SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT)
完成后,您必须调用AcceptEx()
。接受的套接字未与监听套接字的属性完全关联,因此,在设置了SO_UPDATE_ACCEPT_CONTEXT
之前,它不会处于完全连接状态。某些winsock API函数受此影响,包括getpeername()
,getsockname()
和shutdown()
。
如果使用ConnectEx()
进行出站连接,则必须在setsockopt(SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT)
完成后调用ConnectEx()
,然后才能使用shutdown()
。这是MSDN上的documented behavior。它对AcceptEx()
和SO_UPDATE_ACCEPT_CONTEXT
的说法不同,但是shutdown()
对于AcceptEx()
接受的套接字确实具有类似的限制。