gpt4 book ai didi

C 套接字编程 : connect() hangs

转载 作者:行者123 更新时间:2023-12-04 09:30:04 24 4
gpt4 key购买 nike

大家好,我要脱发了。我有一个试图连接到服务器的客户端,一切似乎都很好,使用 gethostbyname() , socket() , bind() ,但是当试图 connect()它只是卡在那里,服务器看不到客户端的任何内容。我知道服务器可以正常工作,因为另一个客户端(也在 C 中)可以正常连接。是什么导致服务器看不到此传入连接?在这里,我已经无能为力了。这两个不同的客户也非常相似,所以我更加迷茫了。

    if (argc == 2)  {
host = argv[1]; // server address
}
else {
printf("plz read the manual\n");
exit(1);
}

hserver = gethostbyname(host);
if (hserver) {
printf("host found: %p\n", hserver);
printf("host found: %s\n", hserver->h_name );
}
else {
printf("host not found\n");
exit(1);
}

bzero((char * ) &server_address, sizeof(server_address)); // copy zeroes into string
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(hserver->h_addr);
server_address.sin_port = htons(SERVER_PORT);

bzero((char * ) &client_address, sizeof(client_address)); // copy zeroes into string
client_address.sin_family = AF_INET;
client_address.sin_addr.s_addr = htonl(INADDR_ANY);
client_address.sin_port = htons(SERVER_PORT);

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
exit(1);
else {
printf("socket is opened: %i \n", sockfd);
info.sock_fd = sockfd;
rv = fcntl(sockfd, F_SETFL, O_NONBLOCK); // socket set to NONBLOCK
if(rv < 0)
printf("nonblock failed: %i %s\n", errno, strerror(errno));
else
printf("socket is set nonblock\n");
}

timeout.tv_sec = 0; // seconds
timeout.tv_usec = 500000; // micro seconds ( 0.5 seconds)
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval));

rv = bind(sockfd, (struct sockaddr *) &client_address, sizeof(client_address));
if (rv < 0) {
printf("MAIN: ERROR bind() %i: %s\n", errno, strerror(errno));
exit(1);
}
else
printf("socket is bound\n");

rv = connect(sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
printf("rv = %i\n", rv);
if (rv < 0) {
printf("MAIN: ERROR connect() %i: %s\n", errno, strerror(errno));
exit(1);
}
else
printf("connected\n");

任何想法或见解都深表感谢。

-傅立叶

编辑:
如果套接字未设置为非阻塞,则它挂起。
如果套接字设置为非阻塞,那么我得到 ERROR connect() 115: Operation now in progress

[进展]
为socket的文件描述符设置了O_NONBLOCK,不能立即建立连接;连接应异步建立。

我还想提一下,服务器和客户端在彼此相邻的计算机上运行,​​就像一个路由器一样连接。

最佳答案

gethostbyname()函数以网络字节顺序生成地址,因此您无需通过 htonl() 传递它们.另外,hostent->h_addr entry 是指向地址的指针。替换这一行:

server_address.sin_addr.s_addr = htonl(hserver->h_addr);

和:
memcpy(&server_address.sin_addr, hserver->h_addr, hserver->h_length);

关于C 套接字编程 : connect() hangs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2652634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com