socket运用中需要注意的一个问题

本文介绍了一位同事在进行socket连接测试时遇到的问题,即在固定次数连接后进程出现halt现象。通过debug发现,由于局部变量设置不当导致资源未被正确释放,最终造成资源耗尽。解决方法是将部分变量改为静态变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值