最近在debug一个其他同事写的关于的socket链接的问题,主要是DQ的同事在对产品进行可靠性测试的过程中发现,PC和对应的系统
进行固定次数的链接后,在arm系统上面的侦测socket的进程会halt。
下面是实现connect功能的函数;
void Socket_Connect()
{
int n;
SOCKET conn_sock = -1;
SOCKET new_sock = -1;
struct sockaddr_in client;
struct linger myLinger;
myLinger.l_onoff = 1;
myLinger.l_linger = 0;
n = sizeof(client);
new_sock = accept(g_listen_sock, (SA *) &client, (socklen_t*) &n);
if (new_sock > 0)
{
setsockopt(new_sock, SOL_SOCKET, SO_LINGER, &myLinger, sizeof(myLinger));
if (conn_sock > 0)
{
close(conn_sock);
}
conn_sock = new_sock;
printf("pc-input-manager new accept ok/n");
}
}
进程主函数:
int main(int argc, char *argv[])
{
while(1)
{
Socket_Connect();
usleep(40000);
}
}
Debug的过程发现每次accept函数的return value都在增加,当增加到1023的时候,这个进行久halt。
最后进行debug发现,该同事本来的想法是想在每次accept新的socket的时候,把上次的socket close掉,但是他犯了一个错误,
因为他把这个条件的变量设置为了局部变量,导致conn_sock变量在下面的code中总是-1,从而无法正确的close掉socket。
if (new_sock > 0)
{
setsockopt(new_sock, SOL_SOCKET, SO_LINGER, &myLinger, sizeof(myLinger));
if (conn_sock > 0)//总是无法进行该code
{
close(conn_sock);
}
conn_sock = new_sock;
printf("pc-input-manager new accept ok/n");
}
最后的结果是这个进程在进行了1023次的链接后,所有的resource都被占用,从而导致进行halt。
修改的方法其实很简单,就是把下面的两个变量
SOCKET conn_sock = -1;
SOCKET new_sock = -1;
修改为
static SOCKET conn_sock = -1;
static SOCKET new_sock = -1;