-1

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

  1. 一个接收数据
  2. 一个发送数据

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

服务器的代码:

      {
            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);

    }
4

1 回答 1

0

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

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

// 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 );
于 2013-04-04T11:55:55.013 回答