【问题标题】:C++ connect function error - Invalid argumentC++ 连接函数错误 - 参数无效
【发布时间】:2012-08-01 14:22:49
【问题描述】:

我正在尝试制作一个简单的套接字客户端(使用 debian 6 和 g++ 编译器),当我调用“连接”函数时,它返回错误代码 22 - 无效参数。请告诉我,我做错了什么。

我已经阅读了这个函数的手册页,它说 3 个参数必须如下:int、struct sockaddr* 和 socklen_t。

我的代码是:

  int                   serverPort;
  u_long                serverHost;
  struct sockaddr_in    serverAddress;
  socklen_t             serverAddressLength;
  int                   clientSocket;

  serverPort = 44444;
  serverHost = inet_addr ( "88.198.237.65" );
  serverAddress.sin_family = AF_INET;
  serverAddress.sin_port =  htons ( serverPort );
  serverAddress.sin_addr.s_addr = htons ( serverHost );
  serverAddressLength = sizeof ( serverAddress );

  clientSocket = socket ( AF_INET , SOCK_STREAM , 0 );

  connect ( clientSocket , (sockaddr*)&serverAddress , serverAddressLength )

【问题讨论】:

    标签: c++ sockets arguments connect


    【解决方案1】:
      serverAddress.sin_addr.s_addr = htons ( serverHost );
    

    IPv4 地址是长而不是短,所以htons 是正确的。反正数据已经是网络字节序了,所以不需要转换。

    inet_addr() 函数将 Internet 主机地址 cp 从 IPv4 数字和点表示法转换为网络字节顺序的二进制数据。

    还有:

     char                  serverHost;
    

    它应该如何适应char

    【讨论】:

    • 最后一个问题 - 运气?!
    • 非常感谢,大卫!请问,如果我不将htons应用于服务器端的serverHost,如果我DO使用htons,为什么绑定函数返回“无法分配请求的地址”并返回“套接字绑定成功”?再次感谢!
    • @Kolyunya:不要试图理解已知的错误代码。它只会让你发疯。 (很可能,幸运的是,htons 将它变成了零,这可能是您真正想要的。)您得到“无法分配请求地址”的原因可能是因为您尝试将 bind 分配到一个不是t 分配给本地系统。
    • 感谢您的回复,大卫。事实上,我确实将套接字绑定到本地 IP 地址。无论如何,我可以看到“htons”出于某种原因 IS 在“bind”函数中是必需的,对吧?
    • 不,它只是将一个错误变为另一个错误。 (htons 对于端口是正确的,但对于 IPv4 地址它从不正确。)修复我提到的错误并发布仍然给您带来麻烦的代码。 (如果这是一个 Linux 机器,在上面运行 strace 也很有帮助。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2010-10-04
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多