TCP发送功能的奇怪行为

时间:2013-10-29 04:24:44

标签: multithreading sockets tcp

我正在编写关于多线程的TCP连接的测试,并且有一个我无法解决的奇怪现象。

该计划非常简单。我们有一台服务器可以接受,三台客户端可以连接。最后,服务器将调用send()将状态返回给客户端并执行类似它的循环。但不幸的是,当服务器接受大约30000个连接时,它将停止返回客户端,客户端将超时并退出。

我试图增加系统端口范围,减少时间等待秒数,并减慢TCP连接速度,但它无法正常工作并正确关闭套接字。

还有其他原因吗? 客户代码:

    while ( true )
    /*connect server */
{
    initSocketLocal(&client_addr,0);//
    client_socket = socket(AF_INET,SOCK_STREAM,0);
    if( client_socket < 0)
    {
        printf("Create Socket Failed!\n");
        return -1;    
    }
    if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
    {
        printf("Client Bind Port Failed!\n");
        close(client_socket);
        return -1;
    }
    initSocket(&server_addr,DATANODE_PORT_READ,ip);

    if((connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length)) < 0)
    {
        perror ("can not connect to server:");  //find error
        printf("client count is %d...\n", clientCount);
        return -1;

    }
    usleep ( 100000 ) ;
    clientCount++;
    printf("client count is %d...\n", clientCount);

    int length = recv ( client_socket ,res ,sizeof ( res ), 0);
    if (length > 0)
    {
        printf ("recv buf is %s \n", res );
    }
    close(client_socket);
    return 0;
}

并将代码重命名为fllows:

while(  true )
    /*wait for connect*/
{
    socklen_t length  =   sizeof (struct  sockaddr );

    printf("listening ..... \n");
    pthread_mutex_lock(&m_read);//lock clifd

    if ((clifd  =  accept(sockRead,( struct  sockaddr * ) & cliaddr, & length)) < 0 )
    {
        perror ("can not accept socket:");
        break;
    }

    printf("Read Accept fd %d\n",clifd);

    pthread_create (&t,NULL,handler,&clifd);

}


void* handler(void*arg)

{
    int fd = *((int *)arg);

    sockCount ++;
    pthread_mutex_unlock(&m_read);
    char  ret [ 10 ];

    printf("accept sock count is :  %d !\n",sockCount);
    usleep ( 100000 ) ;

    strcpy ( ret ,"ok" );
    send ( fd, ret, strlen (ret ), 0);//blocked when sockCount reach to 32571..
    printf ("send ok ..\n");
    close (fd);
    pthread_exit(NULL);

}
~

2 个答案:

答案 0 :(得分:0)

您可能达到了最大连接数。作为给定端口上从客户端到服务器的64K连接的限制。也可以限制防火墙中的连接数。此外,您可能会尝试在每个连接之间暂停5毫秒(或左右)。

答案 1 :(得分:0)

除了在handler()中的sockCount之外还打印fd值,你接近32k。 'ulimit -n'对文件描述符的数量有什么影响?

你在handler()中有一个竞争条件,它会提前解锁互斥锁,允许fd在另一个线程仍在使用时被其他线程修改。