通过AcceptEx()连接套接字的TCP关闭

时间:2012-02-06 23:51:06

标签: windows sockets

AcceptEx()的文档说:

  

成功完成此操作后,sAcceptSocket即可   通过,但仅限于以下功能:

     
      
  • ReadFile的
  •   
  • WriteFile的
  •   
  • 发送
  •   
  • WSASend
  •   
  • 的recv
  •   
  • 的WSARecv
  •   
  • 的TransmitFile
  •   
  • 字关闭
  •   
  • setsockopt(仅适用于SO_UPDATE_ACCEPT_CONTEXT)
  •   

请注意,shutdown()不在列表中。实际上,调用shutdown(sAcceptSocket, SD_SEND)会返回SOCKET_ERRORWSAGetLastError()会产生错误WSAENOTCONN

  

不允许发送或接收数据的请求,因为套接字未连接且(使用sendto调用在数据报套接字上发送时)未提供地址。

为什么不关闭通过AcceptEx()连接的套接字?另外,为什么套接字没有显示为已连接,因为它已经在接收数据(重叠操作已完成且完成通知表明已收到一些size>0字节)?

1 个答案:

答案 0 :(得分:8)

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