打野的典韦 2013-08-19 07:10 采纳率: 0%
浏览 1871

UDP通信中服务端接受数据计算数据包个数

UDP通信中客户端通过多线程发送数据,服务端单线程接受数据,出现的“丢包”(我在服务端计算出来的包个数)现象很严重,通过wireshark抓包发现没有任何数据包丢失,菜鸟求解答。代码如下:

/*基于LINUX的udp的通信,服务器端*/
#include
#include
#include
#include
#include
#include
#include

char buf[1024 * 32] = {0};

int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("Please Input Recv Port\n");
return 1;
}
int sockfd = 0;
int recv_num = 0;
int recv_count = 0;
int client_len = 0;
volatile unsigned long res = 0;//接收数据的总大小
int len_recv_buffer = 1024 * 32;
FILE *fp;
char buffer[1024*320] = {0};

struct sockaddr_in addr;
//1、创建socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1)
{
    printf("Create Socket Error\n");
    return -1;
}

//2、准备地址
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[1]));
addr.sin_addr.s_addr = inet_addr("192.168.17.95");
client_len = sizeof(struct sockaddr_in);

//3、绑定
if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1)
{
    printf("Bind Error\n");
    return 0;
}


//4、接收客户端发送来的数据
time_t t_old = time(NULL);
time_t t_now = t_old;
time_t _old = time(NULL);
time_t  _now = 0;
time_t  _interval = 0;
if ((fp = fopen("recv.txt", "a+")) == NULL)
{
    printf("Open File Error\n");
    return 1;
}
int nRecv = 0;
setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char*)&nRecv, sizeof(nRecv));
while(1)
{
    memset(buf, 0 , sizeof(buf));
    recv_num = recvfrom(sockfd, buf, sizeof(buf), MSG_CTRUNC, (struct sockaddr*)&addr, &client_len);
    if (recv_num <= 0)
    {
        printf("Recv Data Error\n");
        continue;
    }

    ++recv_count;

    res += recv_num;
    t_now = time(NULL);
    _now = time(NULL);
    _interval = _now - _old;
   // if (t_now - t_old >= 1)
    {
     //   printf("recv_num= %d\n", recv_num);
        sprintf(buffer,  "接受数据总大小:res = %lu kbytes, 数据包个数:%d 接受时间:%d s\n", res/1024, recv_count, _interval);
        if ((fputs(buffer,fp)) == 0)
        {
            printf("Fwrite Error\n");
            return 1;
        }
        fflush(fp);
        printf("接收数据总大:res = %lu kbytes, 数据包个数:%d 接受时间:%d s\n", res / 1024, recv_count, _interval);

        t_old = t_now;
    }
}

free(fp);
fp = NULL;
return 0;
}

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-13 10:06
    关注

    这个代码中,在服务端没有使用多线程,只有一个线程在接收数据。如果客户端发送的数据量很大,可能会导致服务端缓存区满,导致数据丢失。建议在服务端使用多线程来接收和处理数据,或者提高缓存区大小来减少数据丢失。

    评论

报告相同问题?

悬赏问题

  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。