关于server端优化的问题
我想用elecard的NWRenderd发送RTP数据,用server去接收RTP的包,但发现刚开始始终有几个包接不到,中问也会出现丢包的问题,本人测试过,如果在发送端加上sleep的话接收正常,但我的目的是想改进我的server代码,使它接收的速度够快
代码如下:
void main()
{
SOCKET socket1;
WSADATA wsaData;
int iErrorCode;
if(WSAStartup(MAKEWORD(2,2),&wsaData))
{
printf("winsock无法初始化!\n");
return;
}
printf("服务器开始创建SOCKET.\n");
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen = sizeof(from);
local.sin_family = AF_INET;
local.sin_port = htons(10202);
local.sin_addr.s_addr=INADDR_ANY;
socket1 = socket(AF_INET,SOCK_DGRAM,0);
bind(socket1,(struct sockaddr*)&local,sizeof(local));
FILE *fp_write = fopen("c:\\test.264","wb");
char startcoder[4] = { 0x00, 0x00, 0x00, 0x01 };
unsigned char F = NULL;
unsigned char NRI = NULL;
unsigned char Type = NULL;
unsigned char nal_head = NULL;
unsigned char FU_A_indicator,FU_A_header;
unsigned char flag = '0';
char *temp_buffer=(char*)malloc(sizeof ( char ) * 414720);
long temp_buffer_len = 0;
memset(temp_buffer,0,sizeof ( char )*414720);
char buffer[414720]="\0";
long rec_size = 0;
while(1)
{
rec_size=recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&fromlen);
if( rec_size!=SOCKET_ERROR )
{
Type=buffer[12]&0x1f;
if( Type == 28 )//判断是否为FU-A切片
{
FU_A_indicator = buffer[12];
FU_A_header = buffer[13];
flag = FU_A_header & 0xe0;
if( flag == 0x80 )//如果是FU-A的第一个 slice,需要加 startcode
{
nal_head = ( FU_A_indicator & 0xe0) | ( FU_A_header & 0x1f );
buffer[13] = nal_head;
memcpy(temp_buffer,startcoder,4);
memcpy(temp_buffer+4,buffer+13,rec_size-13);
temp_buffer_len =4+rec_size-13;
}
else if( flag == 0x40 )//最后一个 slice
{
memcpy(temp_buffer,buffer+14,rec_size-14);
temp_buffer_len = rec_size-14;
}
else//中间 slice
{
memcpy(temp_buffer,buffer+14,rec_size-14);
temp_buffer_len = rec_size-14;
}
}
else if( Type == 24 )
{
int index=0;
index = (int)buffer[14];
memcpy(temp_buffer,startcoder,4);
memcpy(temp_buffer+4,buffer+15,index);
index=index+15;
temp_buffer_len = index+4;
while( index != rec_size )
{
memcpy(temp_buffer+temp_buffer_len,startcoder,4);
memcpy(temp_buffer+temp_buffer_len+4,buffer+index+2,buffer[index+1]);
temp_buffer_len+=buffer[index+1]+4;
index+=buffer[index+1]+2;
}
}
else if(Type<24)
{
memcpy(temp_buffer,startcoder,4);
memcpy(temp_buffer+4,buffer+12,rec_size-12);
temp_buffer_len = 4+rec_size-12;
}
fwrite(temp_buffer,1,temp_buffer_len,fp_write);
}
}
free(temp_buffer);
fclose(fp_write);
closesocket(socket1);
}