0

私はクライアントサーバーアプリケーションを書いています。これまではすべて問題なく、クライアントがリクエストを送信し、サーバーがそれを受け取り、解析していました。しかし、今は答えを送り返したいので、これら2つの関数をコピーし、クライアントからサーバーに write() を配置し、サーバーからクライアントに read() を配置しました。
そして、プログラムを実行すると、すべてがブロックされ、サーバーが待機し、クライアントも待機します。クライアントを ctrl+c すると、サーバーは正しいリクエストのブロックを解除して解析し、別のリクエストを待ちます。何が間違っている可能性がありますか?

クライアントからのコードの一部:

  params.port = atoi(params.pvalue.c_str());  
  hostent *host;              
  sockaddr_in socketHelper;    
  int clientSocket;           
  char buf[BUFFER_LEN];     
  int size;                   
  string data;                
  string recieved;

  // gets info about server
  host = gethostbyname(params.hvalue.c_str());
  if(host == NULL) {
    printErr(ERR_HOSTNAME);
    return ERR_HOSTNAME;
  }

  // makes a socket
  if((clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
    printErr(ERR_SOCKET);
    return ERR_SOCKET;
  }

  socketHelper.sin_family = AF_INET;
  socketHelper.sin_port = htons(params.port);
  memcpy(&(socketHelper.sin_addr), host->h_addr, host->h_length);

  // connects the socket
  if(connect(clientSocket, (sockaddr *)&socketHelper, sizeof(socketHelper)) == -1) {
    printErr(ERR_CONNECTION);
    return ERR_CONNECTION;
  }

  // sends data
  if((size = write(clientSocket, request.c_str(), request.length())) == -1) {
    printErr(ERR_SEND);
    return ERR_SEND;
  } 

  // recieves data
  while ((size = read(clientSocket, buf, BUFFER_LEN)) != 0) {
    recieved.erase();
    recieved.append(buf, size);

    data = data + recieved;
  }

  // closes a connection
  close(clientSocket);

サーバーからのコードの一部:

while(1) {
    int clientSocket = accept(GodParticle, (struct sockaddr*) &GodAddr, &clientSocketSize);
    if(clientSocket == -1) {
      printErr(ERR_ACCEPT);
      return ERR_ACCEPT;
    }

    if((pid = fork()) == 0) {
      while ((size = read(clientSocket, buf, BUFFER_LEN)) != 0) {
        recieved.erase();
        recieved.append(buf, size);

        request = request + recieved;
      }

      parserInput(request);
      getData();
      parserOutput();

      if((size = write(clientSocket, sendback.c_str(), sendback.length())) == -1) {
        printErr(ERR_SEND);
        return ERR_SEND;
      } 

      close(clientSocket);
      exit(ERR_OK);
    }
  }
4

1 に答える 1

0

わかりました、このように答えましょう。recv() は、サーバーからメッセージを受信するまで、デフォルトでプログラムをブロックしています。

recv() がサーバー プログラムをブロックしない理由は、 fork() を使用して子プロセスを作成したためです。

したがって、このブロックを回避するには、他の方法を使用する必要があります(おそらく、選択などを使用するなど)。

于 2013-03-27T20:46:22.463 に答える