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()接受的套接字确实具有类似的限制。

08-27 20:14