某些电话后套接字无效

时间:2014-11-09 16:49:35

标签: c sockets unix network-programming

我正在制作一个应用程序,它需要在同一台机器上的不同端口上运行的客户端和服务器之间进行相互通信。我希望通过网络发送多个(非常多)消息(仅来自客户端 - >服务器不是反向)。所以每次我需要发送消息时我都会调用以下函数。对于一些初始调用它工作正常然后神秘地它开始重新调整错误:setsockopt坏文件描述符。从互联网上我发现close并不会完全破坏套接字,只是删除了它的界面,从而使它在将来无用。也许可以使用的套接字数量有一些限制,并且已达到并且因此没有创建新的套接字。我该如何避免这个问题。或者有可能无论如何我可以创建一次套接字并重复使用它。我正在使用unix C环境。提前致谢。

void client(char ip[50], int port, char s[50])
{
   while(clientActive==1){
   }
   clientActive=1; 
  memset(recvBuff, '0' ,sizeof(recvBuff));


  if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
    {
      printf("\n Error : Could not create socket \n");

    }

  if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(const void *)&true1,sizeof(true1)) == -1)
   {
    perror("Setsockopt");   
   }

  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(port);
  serv_addr.sin_addr.s_addr = inet_addr(ip);

  if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
    {
      printf("\n Error : Connect Failed \n");
    }
    else                                               
    {
      strcpy(sendBuff, s);
      send(sockfd, sendBuff, strlen(sendBuff),0);
    }

    usleep(1000);
    clientActive=0;
 close(sockfd);
}

更新了代码

void client(char ip[50], int port, char s[50])
{
   while(clientActive==1){

   }
   clientActive=1;


  memset(recvBuff, '0' ,sizeof(recvBuff));
so_linger.l_onoff = 1;
so_linger.l_linger = 0;

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
      {
        printf("\n Error : Could not create socket \n");
      }
    else
    {
    if (setsockopt(sockfd,SOL_SOCKET,SO_LINGER,&so_linger,sizeof so_linger)==-1);
     {
      perror("Setsockopt");
     }   
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port);
    serv_addr.sin_addr.s_addr = inet_addr(ip);

  if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
    {
      printf("\n Error : Connect Failed \n");
    }
    else                                               
    {
      strcpy(sendBuff, s);
      send(sockfd, sendBuff, strlen(sendBuff),0);
    }
    usleep(1000);
    clientActive=0;
 close(sockfd);
  }
}

1 个答案:

答案 0 :(得分:0)

如果要保持套接字打开,为什么要在此功能结束时关闭套接字?为什么不在程序开头打开它并在结束时关闭它?