我从 main 调用 setup_udp_socket 方法,该方法在 udppport 上设置了一个 UDP 套接字,然后我在这个套接字上使用 select。当我在这个方法上有一些东西要读时,我调用 udp_communication () 但我收到奇怪的输出
[没有收到消息,即 0 字节,但 char 数组的 strlen 给出 1]。UDP 数据包是由我无权访问的另一个 Java 程序发送的。我使用 nc 并测试它工作正常。但我的代码中似乎存在一些我无法弄清楚的问题。
我在等待
侦听器:从 127.0.0.1 和端口号:48555 获取数据包
收到的消息:字节数:0 len:1
退出 udp_communication
int setup_udp_socket(char* udpport)
{
struct addrinfo hints, *servinfo, *p;
int ret_value;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_PASSIVE;
if ((ret_value = getaddrinfo("127.0.0.1", udpport, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret_value));
exit(FAILED);
}
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((udp_sock = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
perror("udp: socket creation failed");
continue;
}
if (bind(udp_sock, p->ai_addr, p->ai_addrlen) == -1) {
close(udp_sock);
perror("udp: bind");
continue;
}
//listen(udp_sock, 20);
break;
}
if (p == NULL) {
if (servinfo != NULL)
freeaddrinfo(servinfo);
exit(FAILED);
}
freeaddrinfo(servinfo);
printf("udp: waiting to recvfrom and udpport :%s\n", udpport);
}
//udp_recvbuf 是 1024 字节的 char 数组。
void udp_communication() {
struct sockaddr_storage addr;
socklen_t addr_len;
char s[INET6_ADDRSTRLEN];
int n;
addr_len = sizeof(addr);
//udp_sock_flag = fcntl(udp_sock, F_GETFL, 0);
//fcntl(udp_sock, F_SETFL, udp_sock_flag | O_NONBLOCK);
// while(1) {
memset(udp_recvbuf, '\0', BUFFERSIZE);
printf("I am waiting\n");
if (n = recvfrom(udp_sock, udp_recvbuf, 1023 , 0, (struct sockaddr *)&addr, &addr_len) == -1) {
perror("recvfrom");
exit(1);
}
printf("listener: got packet from %s and port number :%d\n ",
inet_ntop(addr.ss_family,
get_in_addr((struct sockaddr *)&addr),
s, sizeof s), ((struct sockaddr_in *)&addr)->sin_port);
printf("Message received:%s number of bytes : %d len: %d\n", udp_recvbuf, n, strlen(udp_recvbuf));
// }
printf("Exiting udp_communication\n");
//pthread_exit(NULL);
}