📄 testptr.c
字号:
#include <stdio.h>
#include <memory.h>
#include <winsock2.h>
#include <process.h>
#include <io.h>
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "ws2_32.lib")
typedef struct
{
short CSRCCnt :4;
short Ext :1;
short Padding :1;
short Ver :2;
short PT :7;
short m :1;
short sn; /*RTP sequence number*/
long ts; /*RPT Time stamp*/
long SSRC; /*RTP synchronization source identifier*/
}RTP_HDR;
struct
{
int srtpPort;
int localIp;
int peerIp;
short localPort;
short peerPort;
int testNum;
int sndRtpCnt;
int rcvRtpCnt;
int rcvSrtpCnt;
int sndSrtpCnt;
int iSwitch; //1 TSET OFF; 0 TESTON
}syspara;
char buf[50] = {0};
short temps;
int templ;
int * sd;
int per;
HANDLE evntId;
struct sockaddr_in s;
int startCnt;
int init()
{
int i;
short port;
WSADATA wsaData;
syspara.iSwitch = 0;
syspara.sndRtpCnt = 0;
syspara.rcvRtpCnt = 0;
syspara.rcvSrtpCnt = 0;
syspara.sndSrtpCnt = 0;
//if(syspara.testNum > 300)
// return -1;
buf[0] = (char)0x80;
buf[1] = 0x12;
temps = 0;
templ = 0;
memset(&s, 0, sizeof(s));
s.sin_family = AF_INET;
s.sin_addr.s_addr = syspara.peerIp;
per = syspara.testNum/16+(((syspara.testNum%16)==0)?0:1);
printf("start events per %d user\r\n",per);
sd = (int*)malloc((syspara.testNum+1)*sizeof(int));
//init socket
if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR)
printf("Error at WSAStartup()\n");
//open socket srtp & rtp
for(i=0; i<= syspara.testNum; i++)
{
struct sockaddr_in srcAddr;
sd[i] = socket(AF_INET,SOCK_DGRAM,0);
if(sd[i] < 0)
{
return errno;
}
memset((char*)&srcAddr, 0, sizeof(srcAddr));
if(i == 0)
port = syspara.srtpPort;
if(i == 1)
port = syspara.localPort;
srcAddr.sin_port = htons(port);
srcAddr.sin_family = AF_INET;
if (-1 == bind(sd[i],(struct sockaddr *)&srcAddr,sizeof(srcAddr)))
{
closesocket(sd[i]);
return errno;
}
port+=2;//递增端口
}
return 0;
}
//task sndRtp
void CALLBACK sndRtp2(UINT uID, UINT uMsg, DWORD i,DWORD dw1,DWORD dw2)
{
RTP_HDR *rh;
UINT e;
short tport;
if(syspara.iSwitch==1) return;
//pkt Rtp
rh = (RTP_HDR *)buf;
if(i==1)
{
tport = syspara.peerPort;
rh->sn = htons(temps++);
templ+=160;
rh->ts = htonl(templ);
}
e = per+i;
for(; i<e;i++)
{
tport = (short)(syspara.peerPort+2*i-2);
s.sin_port = htons(tport);
//modify ssrc
rh->SSRC = htonl(i);
//send
if(sendto(sd[i], buf, 32, 0, (struct sockaddr*)&s, sizeof(s)) < 0 )
return;
//cnt
syspara.sndRtpCnt++;
}
return;
}
void sndRtp(void *p)
{
int i;
for(i=1; i<=syspara.testNum; i++)
{
if(i%per == 1||per==1)
{
if(0 == timeSetEvent(20, 0, (LPTIMECALLBACK)sndRtp2,i,
TIME_PERIODIC|TIME_CALLBACK_FUNCTION))
{
printf("Error events[%d]\r\n",i);
continue;
}
printf("Events[%d]\r\n",i);
}
}
}
//task rcvRtp
void rcvRtp(void *p)
{
int i,size,len;
struct sockaddr_in s;
char rcvbuf[4092]={0};
size = sizeof(s);
//rcv
while(1)
{
for(i=1; i<=syspara.testNum; i++)
{
len = recvfrom(sd[i], (char*)rcvbuf, 4092, 0, (struct sockaddr*)&s, &size);
if(len>0)
syspara.rcvRtpCnt++; //cnt
}
}
return;
}
//task fwdSrtp
void fwdSrtp(void *p)
{
int size,ret,len;
struct sockaddr_in s;
char rcvbuf[4092]={0};
size = sizeof(s);
//rcv
while(1)
{
len = recvfrom(sd[0], (char*)rcvbuf, 4092, 0, (struct sockaddr*)&s, &size);
if(len < 0 )
continue;
//cnt
syspara.rcvSrtpCnt++;
ret = sendto(sd[0], rcvbuf, len, 0, (struct sockaddr*)&s, sizeof(s));
if(ret < 0 )
continue;
syspara.sndSrtpCnt++;
}
return;
}
void main(int c,char **v)
{
int runFlag;
//sysinit
if(c<6)
{
printf("Error para nums.\r\nInput like\r\n\t\"Function srtpport loacalport peerip(1.1.1.1) peerport channels \"\r\n");
getchar();
return;
}
syspara.srtpPort = atoi(v[1]);
syspara.localPort = atoi(v[2]);
syspara.peerIp = inet_addr(v[3]);
syspara.peerPort = atoi(v[4]);
syspara.testNum = atoi(v[5]);
if(0 != init())
{
printf("Error init");
exit(0);
}
//thread init
_beginthread(fwdSrtp, 20000, NULL);
_beginthread(rcvRtp, 20000, NULL);
_beginthread(sndRtp, 20000, NULL);
Sleep(100);
runFlag=1;
printf("\r\nInput\r\n\tEnter for statistic\r\n\tp for pause\t\r\n\tr for run\r\n\tCTRL+C to exit\r\n");
while(1)
{
char input[200];
Sleep(100);
_read(0,input,200);
switch(input[0])
{
case 0xd:
case 0xa:
//case 's':
printf("sndrtp = %d\r\nrcvrtp = %d\r\nrcvSrtp = %d\r\nsndSrtp = %d\r\n",
syspara.sndRtpCnt,
syspara.rcvRtpCnt,
syspara.rcvSrtpCnt,
syspara.sndSrtpCnt);
break;
case 'R':
case 'r':
if(runFlag == 0)
{
syspara.iSwitch=0;
runFlag = 1;
printf("It's resume...\r\n");
}
else
{
printf("It's still running...\r\n");
}
break;
case 'P':
case 'p':
syspara.iSwitch=1;
runFlag = 0;
printf("It's pause...\r\n");
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -