Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading TCP发送函数的一种奇怪行为_Multithreading_Sockets_Tcp - Fatal编程技术网

Multithreading TCP发送函数的一种奇怪行为

Multithreading TCP发送函数的一种奇怪行为,multithreading,sockets,tcp,Multithreading,Sockets,Tcp,我正在写一个关于多线程的TCP连接测试,有一个奇怪的现象我无法解决 这个程序很简单。我们有一个服务器要接受,三个客户端要连接。最后,服务器将调用send()将状态返回给客户端并执行类似的循环。但不幸的是,当服务器接受大约30000个连接时,它停止返回到客户端,客户端将超时并退出 我试图增加系统端口范围,减少等待时间秒,并降低TCP连接速度,但它没有工作,并正确关闭了套接字 还有其他原因吗? 客户端代码: while ( true ) /*connect server */ {

我正在写一个关于多线程的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)
/*连接服务器*/
{
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小得多。