使用Socket接收UDP数据包时服务器端卡顿问题求助
UDP数据包接收卡顿/阻塞问题
我在服务器端接收客户端发送的6000个UDP数据包时,出现以下异常:
- 低熵数据包(全零内容):接收约4000-5000个包后卡顿,需等待30-40秒才能继续接收剩余数据包
- 高熵数据包(随机内容):仅能接收约80个包,之后直接卡住,无法接收后续数据包
我原本猜测是接收缓冲区被填满且未及时清理,但调整缓冲区大小后,服务器处理效率并未提升。
server.c
char buffer[payload_size]; int nBuf = 32*1024; int s = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (const char*)&nBuf, sizeof(int)); if (s < 0) { perror("SO_RCVBUF"); free(cf); exit(EXIT_FAILURE); } printf("receiving low entropy packets\n"); for (int i = 0; i < packet_num; i++) { //memset(&buffer, 0, payload_size); bzero(buffer, payload_size); int n = (int) recvfrom(sockfd, buffer, payload_size, MSG_WAITALL, (struct sockaddr *)&client_addr, &cli_addr_len); printf("i: %d\n", i); if (i == 0 && n > 0) { low_start = clock(); } } memset(buffer, 0, payload_size); low_end = clock(); sleep(1); printf("receiving high entropy packets\n"); for (int i = 0; i < packet_num; i++) { memset(&buffer, 0, payload_size); int n = (int) recvfrom(sockfd, buffer, payload_size, MSG_WAITALL, (struct sockaddr *)&client_addr, &cli_addr_len); printf("i: %d\n", i); if (i == 0 && n > 0) { high_start = clock(); } } high_end = clock();
client.c
char buffer[payload_size]; memset(&buffer, 0, payload_size); int nBuf = 32*1024; setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char*)&nBuf, sizeof(int)); for (int i = 0; i < num_packets; i++) { buffer[0] = (char) ((i >> 8) & 0xFF); buffer[1] = (char) (i & 0xFF); printf("i: %d\n", i); if (sendto(sockfd, buffer, payload_size, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("failed to send udp packet, low entropy"); free(cf); close(sockfd); exit(1); } } printf("low entropy packets sent\n"); sleep(interval_time); char random[payload_size]; get_random_byte(payload_size, random); for (int i = 0; i < num_packets; i++) { random[0] = (char) ((i >> 8) & 0xFF); random[1] = (char) (i & 0xFF); printf("i: %d\n", i); if (sendto(sockfd, random, payload_size, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("failed to send udp packet, high entropy"); free(cf); close(sockfd); exit(1); } } printf("high entropy packets sent\n");
内容的提问来源于stack exchange,提问作者Chris C
相关产品推荐
相关产品推荐

