【发布时间】:2026-02-07 08:20:09
【问题描述】:
这是关于 UDP 套接字的一个非常基本的问题。我自己已经使用它们编写了一些服务器/客户端应用程序,但我现在卡住了,无法看到问题出在哪里。
我正在尝试做一个可以发送和接收数据报的服务器和客户端。因此,服务器在确定的套接字上等待来自客户端的请求,当它通过它接收到某些内容时,它会将其答案发送给客户端。只要服务器收到请求并发送回答案,它就可以工作,但客户端永远不会得到它。
我在这里展示了一些剥离的代码,只是连接的基本部分:
服务器:
if ((socket_id = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {
return;
}
bzero(&server_socket, sizeof(server_socket));
server_socket.sin_family = AF_INET;
server_socket.sin_addr.s_addr = INADDR_ANY;
server_socket.sin_port = htons(8724);
if (bind(socket_id, (struct sockaddr *) &server_socket, sizeof(server_socket)) == -1) {
return;
}
bzero(dgram_buffer, 1024);
client_socket_sz = sizeof(client_socket);
if((dgram_length = recvfrom(socket_id, dgram_buffer, 1024, 0, (struct sockaddr *) &client_socket, (socklen_t *) &client_socket_sz)) == -1) {
return;
}
if (sendto(socket_id, msg_buffer, offset, 0, (struct sockaddr *) &client_socket, (socklen_t) client_socket_sz) < 0) {
return;
}
printf("%s\n", msg_buffer);
客户:
if ((socket_id = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
return;
}
if ((hostp = gethostbyname(hostname)) == 0) {
return;
}
bzero((char *) &client_socket, sizeof(client_socket));
client_socket.sin_family = AF_INET;
client_socket.sin_port = htons(8724);
bcopy(hostp->h_addr, (char *) &client_socket.sin_addr, hostp->h_length);
bzero(msg_buffer,sizeof(msg_buffer));
memcpy(msg_buffer,"mensaje\0",sizeof("message"));
socklen_t client_socket_len = sizeof(struct sockaddr_in);
if (sendto(socket_id, msg_buffer, sizeof(msg_buffer), 0, (struct sockaddr *) &client_socket, client_socket_len) < 0) {
return;
}
bzero(msg_buffer,sizeof(msg_buffer));
if(recvfrom(socket_id, msg_buffer, sizeof(msg_buffer), 0, (struct sockaddr *) &client_socket, &client_socket_len) == -1) {
return;
}
printf("%s\n", msg_buffer);
(我知道缓冲区及其内容没有得到很好的处理;我在我的实际应用程序中做得正确,我只是输入它来快速测试)
谁能给我看看,如果某些设置是错误的,请告诉我?我在网上看过数百个例子,审查了我的旧代码......无济于事。也许我已经在这方面工作了太多小时,而我只是跳过了显而易见的事情。
提前致谢。
【问题讨论】:
-
你能给我们一些可以编译的东西吗?
-
顺便说一句,它是否适用于主机名 == "localhost" - 即。客户端和服务器在同一台机器上?我刚刚编译了它,它可以在 OS X 上运行
-
我尝试切换执行服务器(远程)和客户端(本地)的机器,然后服务器(现在是本地)没有收到任何消息。所以我在两台不同的远程机器上都执行了(虽然在同一个网络上),至少我在这里发布的这个简单代码执行得很好。这是否意味着这是我本地机器的问题?
-
可能是防火墙问题。您如何连接到互联网?
-
@WilliamMorris 在这里您可以找到服务器:(pastebin.com/7D9ty5Hv) 和客户端:(pastebin.com/UxnVTzun)
标签: c sockets client-server