这是关于UDP套接字的一个非常基本的问题。我自己编写了一些使用它们的服务器/客户端应用程序,但我现在卡住了,无法看到问题出在哪里。C中的双向UDP套接字
我想要做一个服务器和客户端,它可以发送和接收数据报。因此,服务器等待来自客户端的确定套接字的请求,当它通过它接收到某个请求时,它将其答案发送给客户端。它只要服务器获得请求并发回答案,但客户端永远不会得到它。
我在这里展示一些剥离代码,只需连接的基本组成部分:
SERVER:
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);
(我知道缓冲区及其内容没有得到很好的对待;我在我的真实应用程序上正确地做到了这一点,我只是输入它以获得快速测试)
任何人都可以给它一看,并告诉我,如果一些设置是错误的?我在网上看到了数百个例子,回顾了我的旧代码...无济于事。也许我已经在这上了很多个小时,而我只是略过了这个明显的。
在此先感谢。
你能给我们一些东西编译吗? –
顺便说一句,它是否与主机名称==“本地主机” - 即。客户端和服务器在同一台机器上?我只是编译它,它在OS X上工作 –
我尝试切换机器我执行服务器(远程)和客户端(本地),然后它是服务器(现在本地),没有得到任何消息。所以我在两个不同的远程机器上执行了两个(尽管在同一个网络上),至少我在这里发布的这个简单代码执行得很好。这是否意味着这是我的本地机器的问题? – freieschaf