Windows TCP关闭,通过AcceptEx()连接套接字
文件说明: 成功完成此操作后,可以启动sAcceptSocket 已传递,但仅传递给以下函数:Windows TCP关闭,通过AcceptEx()连接套接字,windows,sockets,Windows,Sockets,文件说明: 成功完成此操作后,可以启动sAcceptSocket 已传递,但仅传递给以下函数: 读取文件 写文件 发送 沃森德 记录 WSARecv 传输文件 插座 setsockopt(仅适用于SO\u更新\u接受\u上下文) 请注意,列表中没有此项。实际上,调用shutdown(sAcceptSocket,SD\u SEND)返回SOCKET\u错误和WSAGetLastError()产生错误WSAENOTCONN: 不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调
- 读取文件
- 写文件
- 发送
- 沃森德
- 记录
- WSARecv
- 传输文件
- 插座
- setsockopt(仅适用于SO\u更新\u接受\u上下文)
shutdown(sAcceptSocket,SD\u SEND)
返回SOCKET\u错误
和WSAGetLastError()
产生错误WSAENOTCONN
:
不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未提供地址
为什么不能关闭通过
AcceptEx()
连接的套接字?另外,既然套接字已经在接收数据(重叠操作已经完成,并且完成通知表明已接收到一些size>0
字节),为什么套接字没有显示为已连接?您必须在AcceptEx()
完成后调用setsockopt(SOL\u socket,SO\u UPDATE\u ACCEPT\u CONTEXT)
。接受的套接字未与侦听套接字的属性完全关联,因此在设置SO\u UPDATE\u ACCEPT\u CONTEXT
之前,不会处于完全连接状态。一些winsock API函数受此影响,包括getpeername()
、getsockname()
和shutdown()
如果使用
ConnectEx()
建立出站连接,则必须在ConnectEx()
完成后调用setsockopt(SOL\u SOCKET,SO\u UPDATE\u CONNECT\u CONTEXT)
,然后才能使用shutdown()
。这在MSDN上。它对AcceptEx()
和没有相同的说明,所以更新\u ACCEPT\u CONTEXT
,但是shutdown()
对AcceptEx()
接受的套接字有类似的限制。客户端还没有关闭连接吗?如果在AcceptEx
之后直接执行shutdown
,是否会出现相同的错误?@JoachimPileborg:否,客户端尚未关闭连接。我正在测试使用“Connection:keep alive”头接受来自Chrome的HTTP请求。无论是否发送数据,我都会收到此错误。我已经在调用setsockopt()
以确保getpeername()
等按预期工作。让我运行一些测试,我会在这个问题上与您联系。我不确定我最初测试的顺序,但它现在可以工作了。如果删除对setsockopt()
的调用,我会再次收到错误。谢谢!