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() 时是不是需要确认响应?

同时执行 recv() 和 send() winsock

如何使用 winsock 的 send() 函数发送宽字符?

Select模型

Winsock - 10038 错误 - Win2K3 服务器 - 令人费解的行为

如何在winsock中使“发送”非阻塞