客户端无法使用套接字连接到服务器?

时间:2009-10-06 17:55:46

标签: c++ c sockets

我的服务器启动并运行(通过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。

4 个答案:

答案 0 :(得分:4)

而不是inet_addr(host->h_name),请使用host->h_addr_list[0]

答案 1 :(得分:3)

这有用吗?

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

答案 2 :(得分:1)

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

啊 - 你编辑了代码......并添加了一些评论。好的,inet_addr的返回值是-1(4294967295 == 0xFFFFFFFF == -1 == INADDR_NONE),所以它似乎不喜欢你传递的内容。

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

答案 3 :(得分:1)

我确实需要memcpy但很多这种头痛源于一种非常无意识的语法错误:

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

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

if (( clientSocket = socket( AF_INET, SOCK_STREAM , 0 )) == -1)
Gah,你让你学习:)

相关问题