【问题标题】:Client is having trouble connecting to server using sockets?客户端无法使用套接字连接到服务器?
【发布时间】:2009-10-06 17:55:46
【问题描述】:

我的服务器已启动并正在运行(通过 telnet 连接有效,因此我知道它的功能),但我的客户端似乎无法建立连接。我觉得这与我填写 sockaddr_in serverAddr 结构的方式有关。

有人可以帮忙吗?谢谢。

int clientSocket;
char hostname[256];
struct sockaddr_in serverAddr;
struct hostent *host;
socklen_t theirAddrSize;

gethostname(hostname, sizeof(hostname));
host = gethostbyname(hostname);

memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr( host->h_name );
serverAddr.sin_port = htons( 30000 );

if ( clientSocket = socket( AF_INET, SOCK_STREAM , 0 ) == -1) {
    cerr << "socket failed ; exiting..." << endl;
    exit(1);
}

if ( connect( clientSocket , (struct sockaddr *) &serverAddr , sizeof(serverAddr) ) == -1 ) {
    cerr << "connect failed ; exiting..." << endl;
    exit(1);
}

connect 总是返回 -1。

【问题讨论】:

  • 您是否检查过 inet_addr 返回的 IP 地址是否正确?
  • 什么是主机->h_name?显示对套接字和连接的调用。请提供更多代码。
  • host 是 hostent 类型,h_name 返回包含本地 ip 的字符串。
  • 发生了哪些错误? socket() 或 connect() 失败了吗?失败后可以打印errno吗?如果客户端的退出代码是-1(255?),那很可能是段错误。在这种情况下,gethostbyname 会失败。
  • 对非socket的socket操作是错误

标签: c++ c sockets


【解决方案1】:

使用host-&gt;h_addr_list[0],而不是inet_addr(host-&gt;h_name)

【讨论】:

  • 是的,inet_addr 用于将"127.0.0.1" 之类的字符串转换为struct in_addr,但gethostbyname 已经在h_addr_list 数组中生成了struct in_addrs。
【解决方案2】:

这行得通吗?

        memcpy(&serverAddr.sin_addr,
            host->h_addr,
            sizeof(serverAddr.sin_addr));

【讨论】:

【解决方案3】:

据我所知,您在此处发布的代码没有任何问题。它与我多年来编写的套接字客户端代码几乎相同。所以问题要么出在代码的其他地方,要么出在数据中。

啊 - 你已经编辑了代码......并添加了一些 cmets。好的,inet_addr 的返回值是 -1(4294967295 == 0xFFFFFFFF == -1 == INADDR_NONE),所以它似乎不像你传递的那样。

您需要通过调试器运行代码,专注于对 gethostname 和 gethostbyname 的调用。我假设这是测试代码,因为您正在连接到正在运行的同一台机器。

【讨论】:

    【解决方案4】:

    我确实需要 memcpy,但很多这种头痛源于一个非常愚蠢的语法错误:

    if ( clientSocket = socket( AF_INET, SOCK_STREAM , 0 ) == -1)
    

    在将它与 -1 进行比较之前,我必须将赋值用括号括起来。

    if (( clientSocket = socket( AF_INET, SOCK_STREAM , 0 )) == -1)
    

    啊,你活着就是学习:)

    【讨论】:

    • 您应该使用 Ewan Todd 描述的memcpy,而不是调用inet_addr
    猜你喜欢
    • 2023-01-30
    • 2013-12-05
    • 2014-05-21
    • 2011-04-09
    • 1970-01-01
    • 2017-02-25
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多