线程在执行时卡在无限循环中

时间:2013-04-04 11:42:22

标签: c multithreading sockets

我使用线程开发了一个聊天服务器程序。在这个程序中有两个线程:

  1. 一个接收数据
  2. 一个发送数据
  3. 两个线程都包含无限循环,以便连续发送和接收数据。但是当它被执行时,用于接收数据的线程卡在循环中。

    服务器的代码:

          {
                addr_len=sizeof(cli_addr);
                cli_sock=accept(sock,(struct sockaddr *)&cli_addr,&addr_len);
                if(cli_sock<0)
                        printf("\nConnetion Error\n");
                else
                        printf("conneted\n");
    
                status_s=pthread_create(&thread_s,NULL,send_data,&cli_sock);
                if(status_s==0)
                        printf("sending");
                status_r=pthread_create(&thread_r,NULL,recieve_data,&cli_sock);
                if(status_r==0)
                        printf("recieving");
    
        }
    
        }
    
        void *recieve_data(void *num)
        {
        int *sock_r=(int *) num;
        int sock=*sock_r;
        char msg[50];
        while(1)
        {
                recv(sock_r,msg,sizeof(msg),0);
    
                if(strcmp(msg,"exit")==0)
                {
                break;
                }
                printf("recieved data:");
                recv(sock_r,msg,sizeof(msg),0);
                printf("\n%s",msg);
        }
        }
    
        void *send_data(void *num)
        {
        int *sock_s=(int *) num;
        int sock=*sock_s;
        char msg[50];
        while(1)
        {
                gets(msg);
                //printf("sending data");
                if(strcmp(msg,"exit")==0)
                {
                break;
                }
                send(sock_s,msg,sizeof(msg),0);
        }
        send(sock,msg,sizeof(msg),0);
    
        }
    

1 个答案:

答案 0 :(得分:0)

如果像“exit”这样的控制命令是基于int的,那会更好。

此外,接收数据不处理对等连接关闭状态。例如: 复制自here

// Receive until the peer closes the connection
do {

    iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
    if ( iResult > 0 )
        printf("Bytes received: %d\n", iResult);
    else if ( iResult == 0 )
        printf("Connection closed\n");
    else
        printf("recv failed: %d\n", WSAGetLastError());

} while( iResult > 0 );