send(),返回 Winsock 错误 10038
Posted
技术标签:
【中文标题】send(),返回 Winsock 错误 10038【英文标题】:send(), returns Winsock Error 10038 【发布时间】:2009-02-23 14:23:42 【问题描述】:问题:
调用 send(),针对套接字句柄返回 Winsock 错误 10038插图:
acceptedSocket = accept (server, (sockaddr *)&sin, &len);
accept(),返回 0
为每个连接创建一个新的线程
send(),(在线程函数中)返回10038
图解: - 在线程函数中
//omitted
SOCKET RemoteSocket = (SOCKET) client;
//omitted
send (RemoteSocket, stringToSpend, strlen(stringToSpend), 0)
建议:
可能,竞争条件? 可以使用 I/O 完成端口,但目前不能使用【问题讨论】:
【参考方案1】:问题不在于行
acceptedSocket = accept (server, (sockaddr *)&sin, &len) == INVALID_SOCKET)
您将acceptedSocket
设为比较结果,但您应该以某种方式存储从accept 返回的实际套接字:
acceptedSocket = accept (server, (sockaddr *)&sin, &len);
isOK= acceptedSocket!=INVALID_SOCKET;
虽然我对你帖子中不平衡的括号有点困惑,所以我可能错了
【讨论】:
【参考方案2】:accept() 返回一个新连接特定套接字的句柄。对于服务器代码,它涉及 2 个以上的套接字:一个处于侦听状态,您正在调用 accept(),第二个是从 accept() 返回的一个 - 它是一个传入连接套接字。在 accept() 之后可以为第二个传入连接返回套接字等。如果 accept() 返回 0 它不是传入连接 - 这是一个错误。
【讨论】:
一个更正:接受返回 0 是正常(成功)执行。错误由 -1 表示【参考方案3】:嗯,在accept
发生之前,您的send
似乎执行得太快了。因此,在 send 执行时,send 中使用的套接字无效。多线程令人讨厌的特性之一。您需要在 send
线程处等待一个事件,并在发生接受时触发一个事件
【讨论】:
套接字句柄定义为“非负整数”。所以,我相信,零是有效的?以上是关于send(),返回 Winsock 错误 10038的主要内容,如果未能解决你的问题,请参考以下文章
使用 Winsock 的 send()/recv() 时是不是需要确认响应?
如何使用 winsock 的 send() 函数发送宽字符?