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);
}
}