关于server端优化的问题

interlace2010 2011-08-16 10:37:18
我想用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);
}
...全文
77 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
至善者善之敌 2011-08-16
  • 打赏
  • 举报
回复
另外
如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响
程序的性能:
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
interlace2010 2011-08-16
  • 打赏
  • 举报
回复
难道我这个代码没有可以优化的的地方吗?
至善者善之敌 2011-08-16
  • 打赏
  • 举报
回复
可以设置一个大的缓冲区,避免一帧数据重复recv
liuling_8008 2011-08-16
  • 打赏
  • 举报
回复
1. 在服务器端加个缓冲区
2. 服务器端不能处理数据的话给客户端一个反馈,客户端接受到反馈信号后就稍等一会。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧