文档AcceptEx()
说:
成功完成此操作后,可以传递sAcceptSocket,但仅传递给以下函数:
- ReadFile的
- WriteFile的
- 发送
- WSASend
- 的recv
- 的WSARecv
- 的TransmitFile
- 关闭套接字
- setsockopt(仅适用于SO_UPDATE_ACCEPT_CONTEXT)
请注意,这shutdown()
不在列表中.实际上,调用shutdown(sAcceptSocket, SD_SEND)
返回SOCKET_ERROR
并WSAGetLastError()
产生错误WSAENOTCONN
:
不允许发送或接收数据的请求,因为套接字未连接(当使用sendto调用在数据报套接字上发送时)没有提供地址.
为什么不关闭通过连接的套接字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上记录的行为.它并没有说AcceptEx()
和SO_UPDATE_ACCEPT_CONTEXT
,但shutdown()
对接受的套接字有类似的限制AcceptEx()
.
归档时间: |
|
查看次数: |
1781 次 |
最近记录: |