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

时间:2013-12-05 15:51:33

标签: windows sockets winsock2

我有一个Windows服务器应用程序

  • WSAStartup(),显然是
  • 在TCP端口X上监听()
  • 接受()传入连接
  • ioctlsocket()套接字进入非阻塞模式
  • 尝试使用WSASendMsg
  • 回复

我收到WSAEINVAL错误代码,据说这意味着: '套接字尚未绑定绑定,或者套接字未使用重叠标志创建。'

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

那么我得到错误的真正原因是什么呢?

1 个答案:

答案 0 :(得分:0)

AFAICWO:因为我在侦听TCP套接字上使用accept(),所以我得到的是一个面向连接的套接字。所以我必须使用WSASend而不是WSASendMsg。 MSDN文档确实有这个小问题,这有助于我离开:

  

WSASendMsg函数只能与datagrams和raw一起使用   套接字。

(或者,可能,但我不确定这一点,我本可以使用WSASendTo。

  

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