You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:56:01