背景
系统:ubuntu 16.04 server 64bit
该问题出现在HTTP流媒体服务器中,流媒体服务器一直监听服务SOCKECT,当有新的连接时,则读取请求内容,并根据请求内容作出相应回复。
问题是当客户端FD为1087,客户端连接数到达1044时服务器会异常退出,百思不得其解。
出错打印
出错打印使用GDB调试,也不能追踪到具体行数,看起来信息也是很奇怪
*** stack smashing detected ***: /usr/local/bin/mscore terminated
Thread 6 "dohrserver" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff1ac6700 (LWP 7772)]
0x00007ffff3c55428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
出错地方
经过多次调试终于定位到问题出现在poll函数接口,但原理一直没想明白!!!
int ff_network_wait_fd_timeout(int fd, int write,int retrytime)
{
int ev = write ? POLLOUT : POLLIN;
struct pollfd p = { .fd = fd, .events = ev, .revents = 0 };
int ret=0;
do{
ret = poll(&p, 1, 100);/*100ms*/
if(ret!=0)
break;/*fd ready or errors*/
}while(retrytime-->0);
if(!(retrytime>0)){
ret=-1;
}
return ret ;
}