全部。我的客户端服务器程序遇到一些奇怪的问题。我有两种不同类型的客户端尝试连接到一台服务器,其中一种比另一种更准系统,要做的事情更少。但在其他方面它们实际上是相同的。虽然准系统代码可以连接到服务器并且服务器可以很好地接受它,但它的复杂版本却不能。客户端表示已连接,发送消息(通过 send() 和 sendto())并获取发回的字节数。但服务器无法识别它。我不太确定为什么,特别是在比较两个版本的客户端时,它们实际上是同一件事(至少在调用 connect() 之前),详细版本有 bind() 而准系统版本没有。任何人都可以看到为什么这些非常相似的代码不能相似地工作的问题吗:P
if (argc == 3)
{
host = argv[1]; // server address
info.c_name = argv[2];
}
else
{
printf("plz read the manual, kthxbai\n");
exit(1);
}
hp = gethostbyname(host);
if (!hp)
exit(1);
printf("host found\n");
// setting up address and port structure information
bzero((char * ) &server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(SERVER_PORT);
// opening up socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
exit(1);
else
printf("socket is opened: %i \n", sockfd);
info.sock_fd = sockfd;
// binding socket to a port: not in barebone version
rv = bind(sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
if (rv < 0)
{
printf("MAIN: ERROR bind() %s\n", strerror(errno));
exit(1);
}
else
printf("socket is bound\n");
// connecting
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");
我什至不确定问题出在哪里,是客户端的复杂版本还是服务器端?感谢您的启发。
最佳答案
如果代码确实是您正在使用的代码,则由于 TCP 有点晦涩难懂,您的客户端正在(神奇地!)连接到自身 Simultaneous connect支持。
这里的问题是您根本没有使用 gethostbyname
的返回。
如果服务器端口可能在本地计算机上运行,您也不应该绑定(bind)服务器端口。
关于connect() 或accept() 的客户端服务器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2643889/