【发布时间】:2013-10-29 04:24:44
【问题描述】:
我正在写一个关于多线程的TCP连接测试,有一个奇怪的现象我无法解决。
程序很简单。我们有一个服务器要接受,三个客户端要连接。最后,服务端会调用send() 将状态返回给客户端并进行类似的循环。但是很遗憾,当服务端接受大约30000个连接时,就停止返回客户端,客户端就会超时退出。
我尝试增加系统端口范围,减少time-wait秒数,减慢TCP连接速度,但没有奏效并正确关闭了socket。
还有其他原因吗? 客户端代码:
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);
}
~
【问题讨论】:
-
这个程序很简单,并且及时关闭连接,我添加了端口范围,但它没有做任何事情..
-
定义“停止返回客户端”。对我来说没有任何意义。你的意思是“停止发送”?而且你必须发布一些代码,无论你认为它多么简单。
-
@user2864740
SO_REUSEADDR到底和它有什么关系? -
@EJP 是的,当服务器总共达到 32571 个连接时,它停止向客户端发送返回消息..我会发布我的代码。谢谢。
-
如果您修复了错误处理以便实际存在一些错误,您可能希望发现正在发生的事情。如果这些套接字函数中的任何一个返回-1,您应该调用
perror()或打印一个包含适当strerror值的字符串。目前只是一个猜谜游戏。
标签: multithreading sockets tcp