簡體   English   中英

TCP發送功能的異常行為

[英]A strange behavior of TCP send function

我正在編寫有關多線程的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;
}

和切斷代碼如下:

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);

}
~

您有可能達到最大連接數。 在給定端口上,從客戶端到服務器的連接數限制為64K。 也可以限制防火牆中的連接數。 另外,您可以嘗試在每個連接之間放置5毫秒(或大約5秒)的暫停時間。

除了handler()中的sockCount之外,還要打印fd值,您將達到32k。 'ulimit -n'顯示的文件描述符數量是什么?

您在handler()中有一個競爭條件,它會盡早解鎖互斥鎖,從而允許fd仍在使用時被另一個線程修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM