Multithreading TCP发送函数的一种奇怪行为
我正在写一个关于多线程的TCP连接测试,有一个奇怪的现象我无法解决 这个程序很简单。我们有一个服务器要接受,三个客户端要连接。最后,服务器将调用Multithreading TCP发送函数的一种奇怪行为,multithreading,sockets,tcp,Multithreading,Sockets,Tcp,我正在写一个关于多线程的TCP连接测试,有一个奇怪的现象我无法解决 这个程序很简单。我们有一个服务器要接受,三个客户端要连接。最后,服务器将调用send()将状态返回给客户端并执行类似的循环。但不幸的是,当服务器接受大约30000个连接时,它停止返回到客户端,客户端将超时并退出 我试图增加系统端口范围,减少等待时间秒,并降低TCP连接速度,但它没有工作,并正确关闭了套接字 还有其他原因吗? 客户端代码: while ( true ) /*connect server */ {
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)
/*连接服务器*/
{
initSocketLocal(&client_addr,0)//
client\u socket=socket(AF\u INET,SOCK\u STREAM,0);
如果(客户端\u套接字<0)
{
printf(“创建套接字失败!\n”);
返回-1;
}
if(bind(client_socket,(struct sockaddr*)和client_addr,sizeof(client_addr)))
{
printf(“客户端绑定端口失败!\n”);
关闭(客户端_套接字);
返回-1;
}
initSocket(&server\u addr,DATANODE\u PORT\u READ,ip);
if((连接(客户端\u套接字,(结构sockaddr*)和服务器\u addr,服务器\u addr\u长度))<0)
{
perror(“无法连接到服务器:”;//查找错误
printf(“客户端计数为%d..\n”,客户端计数);
返回-1;
}
美国LEEP(100000);
clientCount++;
printf(“客户端计数为%d..\n”,客户端计数);
int length=recv(客户端套接字,res,sizeof(res),0);
如果(长度>0)
{
printf(“recv buf是%s\n”,res);
}
关闭(客户端_套接字);
返回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);
}
~
while(true)
/*等待连接*/
{
socklen_t length=sizeof(结构sockaddr);
printf(“侦听…”\n);
pthread_mutex_lock(&m_read);//lock clifd
if((clifd=accept(sockRead,(struct sockaddr*)&cliaddr,&length))<0)
{
perror(“无法接受套接字:”);
打破
}
printf(“读取接受fd%d\n”,clifd);
pthread_create(&t,NULL,handler,&clifd);
}
void*处理程序(void*arg)
{
int fd=*((int*)arg);
sockCount++;
pthread_mutex_unlock(&m_read);
charret[10];
printf(“接受套接字计数为:%d!\n”,套接字计数);
美国LEEP(100000);
strcpy(ret,“ok”);
发送(fd,ret,strlen(ret),0);//当sockCount达到32571时被阻止。。
printf(“发送确定..\n”);
关闭(fd);
pthread_exit(NULL);
}
~
您可能正在达到最大连接数。在给定端口上,从客户端到服务器的连接数限制为64K。也可以限制防火墙中的连接数。此外,您还可以尝试在每个连接之间暂停5毫秒左右。除了在handler()中打印sockCount外,还可以打印fd值,您接近32k。对于文件描述符的数量,'ulimit-n'显示了什么
您在handler()中有一个竞争条件,它会提前解锁互斥锁,允许fd在其仍在使用时被另一个线程修改。此程序非常简单,并且及时关闭连接,我添加了端口范围,但它没有做任何事情。.定义“停止以返回到客户端”。对我来说没有任何意义。你是说“停止发送”吗?不管你认为它有多么简单,你都必须发布一些代码。@user2864740
那么_REUSEADDR
和它有什么关系呢?@EJP是的,当服务器连接总数达到32571个时,它停止向客户端发送返回消息。我将发布我的代码。谢谢。如果您修复了错误处理,因此确实存在一些错误,那么您可能有希望发现发生了什么。如果其中任何套接字函数返回-1,则应调用peror()
或打印包含相应strerror
值的字符串。目前这只是一个猜测游戏。端口和连接的数量似乎不是限制因素,因为我修改了我的程序,每0.01秒接受一次,客户端每0.01秒启动一次连接,menas总共每秒300个连接。这个建议并不能解释问题。这似乎是一个发送问题,而不是连接问题,在任何情况下,30000都比3 x 65535小得多。