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