2

Linux の C++ で単純なチャット クライアントを作成して、C++ で作成されたコンピューターの win32 チャット サーバーに接続しています。サーバーは動作していると確信していますが、チャット クライアントで問題が発生しています。私はチャット クライアントをフォークしており、1 つのプロセスで着信メッセージを処理し、別のプロセスでメッセージの送信を処理しています。チャット クライアントで 2 つのパイプを使用しているため、各プロセスが終了したときに他のプロセスに通知できるため、他のプロセスが先に進んで終了することができます。パイプは機能していないようですが、どこが間違っているのかわかりません。私のコードを見ていただければ幸いです。たぶん、あなたの誰かが私が正しくしていないことに気付くでしょう。これが私のコードです:

#define ChildRead pipefd1[0]
#define ChildWrite pipefd2[1]
#define ParentRead pipefd2[0]
#define ParentWrite pipefd1[1]

int main()
{
  int nret, theSocket, theMode = 1, pipefd1[2], pipefd2[2];
  struct sockaddr_in server;
  char buf[2] = {0}, message[999] = {0}, ipAddy[20]= {0}, scrName[20] = {0};
  pid_t childpid;

  printf("Enter the IP address to connect to.\n\n");
  scanf("%s", ipAddy);

  printf("\nEnter your screen name.\n\n");
  scanf("%s", scrName);

  theSocket = socket(AF_INET, SOCK_STREAM, 0);

  if(theSocket < 0)
   printf("\nCouldn't create socket\n");

  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = inet_addr(ipAddy);
  server.sin_port = htons(8888);

  printf("\nAttempting to connect to %s\n", ipAddy);

  nret = connect(theSocket, (struct sockaddr *)&server, sizeof(server));

  if(nret < 0)
   printf("\nCouldn't connect\n");

  ioctl(theSocket, FIONBIO, &theMode);

  printf("\nConnected to server!\n\n");

  memset(message, 0, strlen(message));

  pipe(pipefd1);
  pipe(pipefd2);

  fcntl(ParentRead, F_SETFL, O_NONBLOCK);
  fcntl(ParentWrite, F_SETFL, O_NONBLOCK);
  fcntl(ChildRead, F_SETFL, O_NONBLOCK);
  fcntl(ChildWrite, F_SETFL, O_NONBLOCK);

  childpid = fork();

  if(childpid == 0)
  {
    close(ParentRead);
    close(ParentWrite);

    while(1)
    {
      read(ChildRead, &buf, 1);

      if(buf[0] == 'q')
      {
       close(ChildRead);
       close(ChildWrite);
       close(theSocket);
       exit(0);
      }

      if((nret = recv(theSocket, message, 999, 0)) < 1)
       continue; 

      if(message[7] == '~' && message[8] == 'q')
      {
        printf("\nChat server disconnected..\n");  
        write(ChildWrite, "q\0", 1);
        close(ChildRead);
        close(ChildWrite); 
        close(theSocket); 
        exit(0);
      }

      printf("%s\n", message);

      memset(message, 0, strlen(message));
    }
  }
  else
  {  
     strcpy(message, scrName);
     strcpy(&message[strlen(message)], ": ");

     close(ChildWrite);
     close(ChildRead);

     while(1)
     {
       read(ParentRead, &buf, 1);

       if(buf[0] == 'q')
       {
         close(ParentRead);
         close(ParentWrite);   
         close(theSocket);
         printf("hmm\n");
         exit(0); 
       }

       scanf("%s", &message[strlen(message)]);

       if(strcmp(&message[strlen(scrName) + 2], "~q\0") == 0)
       {
         write(ParentWrite, "q\0", 1);
         close(ParentRead);
         close(ParentWrite);
         close(theSocket);
         exit(0);          
       }

       send(theSocket, message, strlen(message), 0);

       memset(&message[strlen(scrName) + 2], 0, strlen(&message[strlen(scrName) + 2]));     
     }  
  } 

  return 0;
}
4

0 に答える 0