【发布时间】:2020-07-22 05:31:40
【问题描述】:
这是我的 UDP 套接字服务器和客户端的代码。
问题是,当我在终端中运行它时,一旦客户端到达服务器,服务器执行就会停止,但在客户端我没有收到任何数据。
客户端.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int network_socket;
network_socket = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(9002);
server_address.sin_addr.s_addr = INADDR_ANY;
sendto(network_socket, 0, 0, MSG_CONFIRM, (const struct sockaddr *) &server_address, sizeof(server_address));
char server_response[256];
int len = sizeof(network_socket);
int = recvfrom(network_socket, &server_response, sizeof(server_response), 0,(struct sockaddr*) &network_socket, (socklen_t*)&len);
printf("The server sent the data : %s\n", server_response);
close(network_socket);
return 0;
}
服务器.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
char server_message[256] = "you have reached the UDP server";
int server_socket,client_address;
server_socket = socket(AF_INET, SOCK_DGRAM,0);
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(9002);
server_address.sin_addr.s_addr = INADDR_ANY;
bind(server_socket, (struct sockaddr *) &server_address, sizeof(server_address));
int n,len;
len = sizeof(client_address);
n = recvfrom(server_socket, server_message, sizeof(server_message), 0, (struct sockaddr *) &client_address, (socklen_t*)&len);
sendto(server_socket, server_message, sizeof(server_message), 0, (struct sockaddr *) &client_address, len);
close(server_socket);
return 0;
}
【问题讨论】:
-
这是我注意到的两件事。首先,您发送的是 0 字节消息。如果您将其更改为非零长度消息,它是否会有所不同。另外,您是否使用 Wireshark 之类的工具监控流量?服务器端可能存在防火墙问题,端口 9002 被阻止。
-
客户端需要指定服务器的IP地址吗?
-
关于:
int = recvfrom(network_socket, &server_response, sizeof(server_response), 0,(struct sockaddr*) &network_socket, (socklen_t*)&len);这不会编译!在int和=之间需要有一个变量名。此外,recvfrom()返回ssize_t,而不是int -
关于:
int = recvfrom(network_socket, &server_response, sizeof(server_response), 0,(struct sockaddr*) &network_socket, (socklen_t*)&len);和 `printf("The server sent the data : %s\n", server_response );` 函数:recvfrom()不为 NUL 终止数据读取,所以在这两个语句必须是语句:server_response[ <returned value from recvfrom()> ] = '\0'; -
关于:
server_address.sin_addr.s_addr = INADDR_ANY;INADDR_ANY是字符串:“0.0.0.0”,不能直接赋值。建议:server_address.sin_addr.s_addr = htonl( INADDR_ANY );
标签: c linux sockets network-programming udp