【问题标题】:"setsockopt SO_SNDBUF failed in tcp_connect()"“setsockopt SO_SNDBUF 在 tcp_connect() 中失败”
【发布时间】:2013-03-29 16:19:12
【问题描述】:

我的 C 客户端出现问题,我在其中实现了一个客户端 gsoap 程序来调用 Web 服务。

在 Windows PC 上一切正常,但是当我在基于 linux 的 POS 设备上发布我的代码时,我收到以下错误:

"setsockopt SO_SNDBUF failed in tcp_connect()"

我应该从哪里开始调试这个错误,可能是什么原因?

返回的errornum是2

产生错误的代码部分:(在stdsoap2.c中)

 if (setsockopt(sk, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))){
    soap->errnum = soap_socket_errno(sk);
    soap_set_sender_error(soap, 
                          tcp_error(soap), 
                         "setsockopt SO_SNDBUF failed in tcp_connect()",
                          SOAP_TCP_ERROR);
    soap->fclosesocket(soap, sk);

#ifdef WITH_IPV6
    freeaddrinfo(ressave);
#endif
    return SOAP_INVALID_SOCKET;
  }

【问题讨论】:

  • 您的标题包含您自己发明的错误消息。因此,它在这里作为一个标题是徒劳的。作为错误消息也是徒劳的。什么是'errno'?当您遇到系统错误时,告诉自己您自己的消息是没有帮助的。告诉自己系统的错误。
  • 原来很简单!!我只需要使用专用于 linux 的二进制文件构建 c/c++ 文件.... gsoap(wsdl2h,soapcpp2)

标签: sockets gsoap setsockopt


【解决方案1】:

len 参数有多大?该值可能适用于 Windows,但由于某种原因被 linux 拒绝。查看提交的实际值,看看它们是否合理。

您也可以尝试将其缩减为一个非常小的程序,该程序仅设置一个套接字并尝试复制对 setsockopt() 的调用,并查看它是否仍然因主程序尝试使用的 SO_SNDBUF 大小而失败。

【讨论】:

  • 通常这个变量等于soap_buf length=65535 bytes int len = SOAP_BUFLEN ;我将尝试使用较小的值。我尝试了一个测试 setsockopt 和 getsockopt 的小程序
【解决方案2】:

原来是一个非常简单的!

我只需要使用专用于 linux 的二进制文件构建 c/c++ 文件....

gsoap(wsdl2h,soapcpp2)

windows build 使用 winsock 和 linux build 使用标准套接字 并且两个系统上的套接字是不同的!

这就是我收到套接字错误的原因。

希望这对其他人有所帮助,收到此套接字错误消息..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多