2

这是关于 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);

(我知道缓冲区及其内容没有得到很好的处理;我在我的实际应用程序中做得正确,我只是输入它来进行快速测试)

任何人都可以看看并告诉我某些设置是否错误?我在网上看过数百个例子,审查了我的旧代码......无济于事。也许我已经在这方面工作了太多小时,而我只是跳过了显而易见的事情。

提前致谢。

4

2 回答 2

0

您需要绑定两个套接字。

您已经将服务器绑定到一个众所周知的端口。
您还应该将客户端绑定到端口 0。这意味着操作系统为此会话选择任意端口。绑定套接字时,您将获得数据包到该端口。

于 2012-05-06T12:57:54.633 回答
0

只是一个猜测。尝试在“while”循环中从套接字读取。像这样的东西:

int received = 0;
int tmp;
int expected = ...
while(received != expected){
    tmp = recvfrom(socket_id, msg_buffer, sizeof(msg_buffer), 0, (struct sockaddr *) &client_socket, &client_socket_len)
    if(tmp == -1){ ... }
    received += tmp;
}
于 2012-05-06T12:59:28.040 回答