Windows 对于从accept()返回的套接字,为什么WSASendMsg会返回WSAEINVAL?

Windows 对于从accept()返回的套接字,为什么WSASendMsg会返回WSAEINVAL?,windows,sockets,winsock2,Windows,Sockets,Winsock2,我有一个Windows server应用程序 显然是WSAStartup() 在TCP端口X上侦听() 接受()传入连接 ioctlsocket()将套接字转换为非阻塞模式 尝试用WSASendMsg回复 我收到WSAEINVAL错误代码,这可能意味着: '套接字未使用bind绑定,或者未使用重叠标志创建套接字。' 在这种情况下,调用bind()没有意义,因为套接字已经与本地和远程地址连接。而且套接字也肯定不是用重叠标志创建的 那么,我得到逃过这一行文档的错误的真正原因是什么呢?AFAICW

我有一个Windows server应用程序

  • 显然是WSAStartup()
  • 在TCP端口X上侦听()
  • 接受()传入连接
  • ioctlsocket()将套接字转换为非阻塞模式
  • 尝试用WSASendMsg回复
我收到WSAEINVAL错误代码,这可能意味着: '套接字未使用bind绑定,或者未使用重叠标志创建套接字。'

在这种情况下,调用bind()没有意义,因为套接字已经与本地和远程地址连接。而且套接字也肯定不是用重叠标志创建的


那么,我得到逃过这一行文档的错误的真正原因是什么呢?

AFAICWO:因为我正在使用
accept()
侦听TCP套接字连接请求,accept返回给我的是一个面向连接的套接字。因此,我必须使用
WSASend()
而不是
WSASendMsg()
。MSDN文档中确实有这样一个小道消息,它最终让我知道了我错在哪里:

WSASendMsg函数只能用于数据报和原始数据 插座

换句话说,
WSASendMsg()
仅用于UDP、ICMP或任何其他原始套接字等无连接场景,您可以在这些场景中编写自己的数据包

(可能我也可以使用
WSASendTo()
来代替:)

在面向连接的套接字上,忽略lpTo和iToLen参数; 在这种情况下,WSASendTo相当于WSASend


AFAICWO:因为我正在使用
accept()
监听TCP套接字连接请求,所以accept返回给我的是一个面向连接的套接字。因此,我必须使用
WSASend()
而不是
WSASendMsg()
。MSDN文档中确实有这样一个小道消息,它最终让我知道了我错在哪里:

WSASendMsg函数只能用于数据报和原始数据 插座

换句话说,
WSASendMsg()
仅用于UDP、ICMP或任何其他原始套接字等无连接场景,您可以在这些场景中编写自己的数据包

(可能我也可以使用
WSASendTo()
来代替:)

在面向连接的套接字上,忽略lpTo和iToLen参数; 在这种情况下,WSASendTo相当于WSASend


MSDN的措辞似乎有些草率。它应该说是“数据报套接字或原始套接字”。非常感谢,它省去了我的麻烦。不过要澄清一点:文档最上面说“WSASendMsg函数从连接的和未连接的套接字发送数据和可选控制信息。”?这里的“已连接”指的是原始插座吗?因为我完全认为它的意思是“连接”意味着你可以在面向连接的套接字上使用它…@user541686欢迎!所谓连接,我的意思是我已经接受了TCP连接请求,即它是一个流套接字连接。让我更新我的答案来澄清一下……MSDN的措辞似乎有些草率。它应该说是“数据报套接字或原始套接字”。非常感谢,它省去了我的麻烦。不过要澄清一点:文档最上面说“WSASendMsg函数从连接的和未连接的套接字发送数据和可选控制信息。”?这里的“已连接”指的是原始插座吗?因为我完全认为它的意思是“连接”意味着你可以在面向连接的套接字上使用它…@user541686欢迎!所谓连接,我的意思是我已经接受了TCP连接请求,即它是一个流套接字连接。让我更新我的答案以澄清。。。