创建1020次通信后无法创建Socket

时间:2014-07-05 22:11:01

标签: c linux sockets gcc

我正在关注此链接Socket programming中的套接字编程教程。并尝试开发一个应用程序,客户端将从服务器接收网络时间并打印时间。以下是该计划的运作方式 -

服务器正在等待传入连接,当客户端尝试连接服务器时,服务器接受连接,服务器将时间发送给客户端。通过socket客户端接收后打印时间。

每次发送给客户端的消息后,服务器关闭连接并等待下一次。 客户端能够与服务器 进行1020次通信如果我尝试从客户端到服务器通信超过1020次,那么我 错误 - 无法创建套接字

我正在尝试开发一个应用程序,客户端可以与服务器无限次至少20000次进行通信。

我怀疑,在客户端创建套接字时可能没有释放内存。

Sample output :

counter=1017 Sun Jul  6 03:19:48 2014
counter=1018 Sun Jul  6 03:19:48 2014
counter=1019 Sun Jul  6 03:19:48 2014
counter=1020 Sun Jul  6 03:19:48 2014

错误:无法创建套接字 (为什么?)

这是我的代码

Server.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h> 

int main(int argc, char *argv[])
{
    int listenfd = 0, connfd = 0;
    struct sockaddr_in serv_addr; 

    char sendBuff[1025];
    time_t ticks; 

    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff)); 

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(5000); 

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

    listen(listenfd, 10); 

    while(1)
    {
        connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

        ticks = time(NULL);
        snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
        write(connfd, sendBuff, strlen(sendBuff)); 

        close(connfd);
      //  sleep(1);
     }
}
  

Client.c

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h> 

int main(int argc, char *argv[])
{
    int sockfd = 0, n = 0;
    char recvBuff[1024];
    struct sockaddr_in serv_addr; 

    if(argc != 2)
    {
        printf("\n Usage: %s <ip of server> \n",argv[0]);
        return 1;
    } 

int counter=0;

while(counter <2000)
{
    memset(recvBuff, '0',sizeof(recvBuff));
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Error : Could not create socket \n");
        return 1;
    } 

    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000); 

    if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
    {
        printf("\n inet_pton error occured\n");
        return 1;
    } 

    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
       printf("\n Error : Connect Failed \n");
       return 1;
    } 

    while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
    {
        recvBuff[n] = 0;
        printf("counter=%d ",counter);
        fputs(recvBuff, stdout);
       /*
        if(fputs(recvBuff, stdout) == EOF)
        {
            printf("\n Error : Fputs error\n");
        }
        */ 
    } 

counter++;
}
    if(n < 0)
    {
        printf("\n Read error \n");
    } 

    return 0;
}

我在Ubuntu下使用gcc。任何有助于理解原因和解决方案以及运行该程序大约20000的帮助都将受到高度赞赏。提前谢谢。

4 个答案:

答案 0 :(得分:4)

使用它后,您没有关闭客户端的套接字。您需要在客户端代码中使用此行:

close(sockfd);

在你的while循环之后。

答案 1 :(得分:2)

您似乎在客户端代码中泄漏了套接字。您在外部循环中创建套接字,但是您永远不会关闭它们。尝试将close(sockfd);添加到外部循环的末尾,并添加到您中断或退出的所有点。

答案 2 :(得分:0)

由于您使用相同的客户端连接到服务器,因此无需重新启动socket&amp;连接进程,您可以阻止客户端,直到您从服务器获取一些数据。否则,您不必浪费大量内核资源,而且您正在关闭并在非常快速的阶段开放,这不是一个好主意!

答案 3 :(得分:0)

我有同样的问题。 在我的情况下,在fopen("/proc/net/route" , "r");之后,我忘了fclose()

fopen("/proc/net/route" , "r");之后,我发现套接字号增加了,所以我认为这是同样的问题。