0

私は単純なサーバークライアントアプリケーションを作成しようとしています.これは、クライアントがサーバーに接続し、サーバーがメッセージを待ち、クライアントがユーザーからの入力を受け取り、それをサーバーに送信することだけです. サーバーはこのメッセージを受信し、それをクライアントに送り返します。クライアントはメッセージを出力し、ループして最初からやり直します。ただし、何らかの理由で、かなり奇妙な問題があります。最初のメッセージを送信すると、サーバーが応答し、2 番目のメッセージを送信すると、サーバーが最初のメッセージで再度応答します。3 番目のメッセージを送信すると、サーバーは 2 番目のメッセージなどで応答します。

接続を処理するサーバー コードは次のとおりです。

class themusers {
    char ReMessage[200],SeMessage[200];

public:
    void * HandleConnections(SOCKET connector,int location) {

    std::string Converter;

        for (;;) {

        if (recv(connector,ReMessage,sizeof(ReMessage),NULL) == -1)
            std::cout << "Disconnected." << std::endl;
            discon.lock();
            sock_connection[location] = NULL;
            discon.unlock();
            break;
        }


        else {
                   //this is the code that handles the receive/send operation
            msgmut.lock();
            //std:: cout << ReMessage << std::endl;
            memcpy(SeMessage, ReMessage, sizeof(ReMessage));
            send(connector, SeMessage, sizeof(SeMessage), NULL);
            msgmut.unlock();        
        }

        }


        return NULL;
        }
};

そして、これは私のクライアントコードです:

for (;;) {
    cin >> tell;
    send(sock, tell, sizeof(tell), NULL);
    recv(sock,Message,sizeof(Message),NULL);
    Converter = Message;
    cout << "Server: " << Converter << endl;
}
4

3 に答える 3

1

[TCP] ソケット プログラミングの経験則 -バイト数を数えますsend(2)これは、とから返される値に実際に注意を払うことを意味しますrecv(2)。これらは、それぞれネットワークから送信および入力されたバッファーの量を示します。

UDP では状況が少し異なりますが、それはおそらくここでは重要ではありません。

于 2013-03-07T20:04:23.027 に答える
0

Boost ASIO は、同期操作と非同期操作の両方を実装するためのネットワークおよびソケット I/O の使用法のための非常に優れた C++ ライブラリです。

ここで見つけることができます:

http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio.html

また、チャット サーバー用のライブラリの実装やその他の用途を示す例もあります。

http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html

非同期操作を構築する方法を学ぶことに興味がある場合は、proactor 設計パターンを調べる必要があります。

于 2013-03-07T20:21:23.357 に答える
0

私はニコライに同意します。返されたバイト数を記録することが重要です。また、recv() からの戻り値に基づいて、デフォルトの else 句を条件付きに変更します。

コンパイラは NULL をゼロとして定義していますか? recv 関数の引数もゼロに変更する方がおそらく安全です。

送信バッファにコピーした後、受信バッファを変更/ゼロにすることも検討してください。(トレーサビリティのため)

于 2013-03-07T20:22:13.710 に答える