我研究套接字并尝试编写一个非常简单的应用程序。客户端发送字符串“Hello There!”,服务器接受它,显示在自身上并发送回来。编写客户端(Linux Ubuntu 18.04)和服务器(macOS 10.14.2,IP:217.144.173.149): 服务器:
int main()
{
int sock, listener;
struct sockaddr_in addr;
char buf[1024];
int bytes_read;
listener = socket(AF_INET, SOCK_STREAM, 0);
if(listener < 0)
{
perror("socket");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
exit(2);
}
listen(listener, 1);
while(1)
{
sock = accept(listener, 0, 0);
if(sock < 0)
{
perror("accept");
exit(3);
}
while(1)
{
bytes_read = recv(sock, buf, 1024, 0);
if (bytes_read <= 0) break;
printf(buf);
send(sock, buf, bytes_read, 0);
}
close(sock);
}
return 0;
}
客户:
int main()
{
char message[] = "Hello there!\n";
char buf[sizeof(message)];
int sock;
struct sockaddr_in addr;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
perror("socket");
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
addr.sin_addr.s_addr = inet_addr("217.144.173.149");
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("connect");
exit(2);
}
send(sock, message, sizeof(message), 0);
recv(sock, buf, sizeof(message), 0);
printf(buf);
close(sock);
return 0;
}
但是,启动客户端后,它只是挂起,并在一段时间后给出错误:connect: Connection timed out。当然,服务器同时也可以工作。谷歌搜索没有给出结果(也许我正在寻找)。我做错了什么?
最佳答案
问题在于您将 IP 地址从表示类型转换为网络类型的方式。
- 如果 IP 地址是静态的,您应该使用它,而不是使用
INADDR_ANY
。 - 如果问题仍然存在,请尝试使用不同的函数来转换 IP。
如需进一步引用,请访问 here .
关于使用 C 将 Linux 客户端连接到 MacOS 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53920575/