【问题标题】:send(), returns Winsock Error 10038send(),返回 Winsock 错误 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 完成端口,但目前不能使用

【问题讨论】:

    标签: c++ windows visual-studio-2008 multithreading winsock


    【解决方案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 线程处等待一个事件,并在发生接受时触发一个事件

      【讨论】:

      • 套接字句柄定义为“非负整数”。所以,我相信,零是有效的?
      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      相关资源
      最近更新 更多