qq_39178295 2023-02-02 16:03 采纳率: 0%
浏览 28

udp sendto耗时问题

udp socket sendto耗时为何很不稳定?代码如下:

#include<stdio.h>
#include<iostream>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <sys/time.h>
#include<sys/types.h>
#include<stdlib.h>
#include<errno.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<signal.h>
#include <fcntl.h>
#include <vector>

using namespace std;

int getcrttick()
{


        struct timeval time_now = {0};
        long time_sec = 0;//
        long time_mil = 0;//
        long time_mic = 0;//

        gettimeofday(&time_now,NULL);
        time_sec = time_now.tv_sec;
        return time_sec * 1000 + time_now.tv_usec/1000;

}

int main()
{
       int sock_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//
     if(sock_fd < 0)
     {
         perror("socket");
         return 0;
     }
     cout << "eeeeee:" << sock_fd  << endl;//eeeee
     std::vector< struct sockaddr_in> vecpeeraddr;//eee
     struct sockaddr_in addr;
     addr.sin_family = AF_INET;//eeeee
     addr.sin_port = htons(6010);//eeeeeee
     addr.sin_addr.s_addr = inet_addr("192.168.1.93");//eeeee
     int ret = bind(sock_fd,(struct sockaddr*)&addr, sizeof(addr));//eeeee
     if(ret < 0)
     {
         perror("bind");
         return 0;
     }


    getsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF, (char*)&a, &getnumlen);

    printf( "getsockopt %d\n", a);

    sockaddr_in peer_addr;//
    socklen_t len = sizeof(peer_addr);
    while(vecpeeraddr.size()<220)//eeeee
    {
         char buf[1024] = {0};

         int recv_size  = recvfrom(sock_fd, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&peer_addr, &len);

         bool bfind=false;
         for (int i=0;i<vecpeeraddr.size();++i)
         {
             if(vecpeeraddr[i].sin_port ==peer_addr.sin_port)
             {
                bfind=true;
                break;
             }
         }
        if (!bfind)
        {
            vecpeeraddr.push_back(peer_addr);
        }

         if(recv_size > 0)
         {
             printf("sendeeeewerwerwr finish peeeeeeeeeee\n" );

//             break;//
         }
    }


    int x = getcrttick();

    while(1)//eeeee
     {
        int passtime=getcrttick()-x;

        if (passtime<20)
        {
            usleep(0);
            continue;
        }

         x=getcrttick();

         char buf[1024] = {0};
         int t=getcrttick();
         sprintf(buf, "123456789012345678901234567890123456789012345678901234567890client12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890client12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890client12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890client12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890client12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890client12345678901234567890123456789012345678901234567890 ");//eeeeeee

        for (int i=0;i<200;i++)
        {
        int t=getcrttick();

            memset(buf, '\0', sizeof(buf));//eeeeebufd
            char *pbbb=new char[512];
            memcpy(pbbb,buf,512);
            int c=sendto(sock_fd, pbbb, 512,MSG_DONTWAIT , (struct sockaddr*)&vecpeeraddr[i], sizeof(vecpeeraddr[i]));
            if(c<=0)
                printf("send error!\n");
            delete [] pbbb;
           if (getcrttick()-t>5)
                {
                 printf("send finish passtime:>>>>>>>>>>>>%d %d %d\n", t , getcrttick(),getcrttick()-t  );
                }

         }




     }

     close(sock_fd);
}

**
其中printf("send finish passtime:>> , getcrttick(),getcrttick()-t );这句打印的有时候高达50ms有同学帮忙解答下吗?**

客户端开启200个socket不停的给这个程序发消息 客户端代码

#include "stdafx.h"
#include<iostream>
#include<cstring>
#ifdef _WIN32

#include<winsock2.h>
#include <ws2def.h>

#endif

sockaddr GetSockAddr(uint8_t b1, uint8_t b2, uint8_t b3, uint8_t b4, uint16_t inPort) {
    sockaddr addr;
    sockaddr_in *addrin = reinterpret_cast<sockaddr_in*>(&addr);
    addrin->sin_family = AF_INET;
    addrin->sin_addr.S_un.S_un_b.s_b1 = b1;
    addrin->sin_addr.S_un.S_un_b.s_b2 = b2;
    addrin->sin_addr.S_un.S_un_b.s_b3 = b3;
    addrin->sin_addr.S_un.S_un_b.s_b4 = b4;
    addrin->sin_port = htons(inPort);

    return addr;
}


int main()
{
    WSADATA wsd;
    if (WSAStartup(MAKEWORD(2, 2), &wsd)) {
        std::cout << "WSAStartup Error" << std::endl;
        exit(-1);
    }
    const int v = 250;
    SOCKET udpSocket[v];
//    SOCKET udpSocket = socket(AF_INET, SOCK_DGRAM, 0);
    for (int i = 0; i < v; i++)
    {
        udpSocket[i] = socket(AF_INET, SOCK_DGRAM, 0);
    }

    const size_t BufMaxSize = 1000;
    char buf[1000] = {};
    sockaddr toAddr = GetSockAddr(192, 168, 1, 93, 6010);
    int toAddrLen = sizeof(sockaddr);
    std::cout << ">>> ";
    while (true) {
        //if (std::cin >> buf)
        {
            for (int i = 0; i < v; i++)
            {
                sockaddr frm;
                int len = sizeof(frm);
                sendto(udpSocket[i], buf, strlen(buf), 0, &toAddr, toAddrLen);
                std::cout << "已发送!" << std::endl;
                std::cout << ">>> ";
                memset(buf, 0, sizeof(buf));
            //    int f=recvfrom(udpSocket[i], buf, 512, 0, &frm, &len);
            //    printf(buf);
            }

        }
        Sleep(1);
    }

}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-02-02 18:05
    关注
    评论

报告相同问题?

问题事件

  • 修改了问题 2月2日
  • 创建了问题 2月2日

悬赏问题

  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 为什么我安装了Homebrew之后,无法像官网的那样通过执行命令安装Watchman
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表