[英]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.