2

このコードはすべてbeejガイドから入手したので、そこからすべての受け入れを確認できます。Beej のコードでは、クライアントからメッセージを取得し、そのメッセージを他のすべてのクライアントに送信します。これは、次のスニペットから確認できます。

                // handle data from a client
                if ((nbytes = recv(i, buf, sizeof buf, 0)) <= 0) {
                    // got error or connection closed by client
                    if (nbytes == 0) {
                    //handle error
                    }
                } 
                else {
                    // we got some data from a client
                    for(j = 0; j <= fdmax; j++) {
                        // send to everyone!
                        if (FD_ISSET(j, &master)) {
                            // except the listener and ourselves
                            if (j != listener && j != i) {
                                if (send(j, buf, nbytes, 0) == -1) {
                                    perror("send");
                                }
                            }
                        }
                    }
                }
            } // END handle data from client

すべてのクライアントに同じメッセージを送信する代わりに、それを要求/応答機能に適応させ、データを受信した同じクライアントに応答を送信したいと考えています。

ここに私がこれまでに持っているものがあります:

long length = 0;
string stringRead;
messagebroker broker;
read( i, &length, sizeof( length ) );
length = ntohl( length );
if(length > -1)
while ( 0 < length ) {
     char buffer[1024];
     int cread;
     cread = read( i, buffer, min( sizeof( buffer ), length ) );
     stringRead.append( buffer, cread );
     length -= cread;
 }
cout << "Got Message: " + stringRead << endl;
string response = broker.handleMessage(stringRead.c_str());

cout << "sending response" << response << endl;

//socket ready for writing
if (FD_ISSET(i, &master)) { //should i check to see if write_fds? I have this here
                                //simply because the guide has it, but i am suspicious
                                //it is there so we can not write to the master.
  length = htonl( response.length() );
  cout << "sent length" << endl;
  if(send( i, &length, sizeof(length) , 0) == 0){
     fprintf(stderr, "Error sending data %d\n", errno);
     exit(3);
  }
  if(send( i, response.data(), response.length(),0 )== 0){
          fprintf(stderr, "Error sending data %d\n", errno);
          exit(3);
      }
    }   //end if

サーバーでクライアントからすべてのデータを受け取ります。問題がサーバーにデータを書き戻しているのか、クライアントから読み取っているのかはわかりません。サーバーからクライアントに書き込んでいると思います。コメントでほのめかしたように、どこが間違っていたかはわかっていると思いますが、この if ステートメントを削除しましたが、クライアント側で何も読み取ることができませんでした。最初に書き込み可能フラグを設定する必要がありますか? 他に何か必要な場合はお知らせください。申し訳ありませんが、この投稿は非常に長くなりました。

4

1 に答える 1

1

書き込みを行うだけです。-1/EWOULDBLOCK、または完全な応答を書き込めなかったことを示す値が返された場合は FD を writefds に追加し、FD が書き込み可能になったときに書き込みを続行します。通常、FD は書き込み可能であるため、writefds はありません。つまり、通常、FD はソケット送信バッファーにスペースを持っています。

于 2012-11-05T22:00:17.020 に答える