1

このプロジェクトにしばらく取り組んでいて、リモート接続を介していくつかの新機能をテストしたかったのですが、クライアントは接続に失敗しました (以前は接続できていました)。すべてがローカルで正常に動作します。現時点ではポートフォワードができないので、ハマチを使用しています。Wireshark を使用して hamachi ネットワーク トラフィックをキャプチャしようとしましたが、クライアント リクエストは届きますが、サーバーはそれらを受信しません。

どんな助けでも大歓迎です。

コード(コードを読みやすくするためにエラー チェックを省略):

クライアント:

   addrinfo ADDRESSINFO, *CLIENTINFO=NULL;

   ZeroMemory(&ADDRESSINFO, sizeof(ADDRESSINFO));
   ADDRESSINFO.ai_family = AF_INET;
   ADDRESSINFO.ai_socktype = SOCK_STREAM;
   ADDRESSINFO.ai_protocol = IPPROTO_TCP;

   ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

   getaddrinfo(strIP.c_str(), strPort.c_str(), &ADDRESSINFO, &CLIENTINFO);

   connect(ConnectSocket, CLIENTINFO->ai_addr, CLIENTINFO->ai_addrlen);

   freeaddrinfo(CLIENTINFO);

サーバ:

addrinfo ADDRESSINFO, *SERVERINFO=NULL;

ZeroMemory(&ADDRESSINFO, sizeof(ADDRESSINFO));

ADDRESSINFO.ai_family = AF_INET;
ADDRESSINFO.ai_socktype = SOCK_STREAM;
ADDRESSINFO.ai_protocol = IPPROTO_TCP;

getaddrinfo(SERVER_IP, SERVER_PORT, &ADDRESSINFO, &SERVERINFO);

ListenSocket = socket(SERVERINFO->ai_family, SERVERINFO->ai_socktype, SERVERINFO->ai_protocol);
ConnectionSocket = socket(SERVERINFO->ai_family, SERVERINFO->ai_socktype, SERVERINFO->ai_protocol);

bind(ListenSocket, SERVERINFO->ai_addr, SERVERINFO->ai_addrlen);

freeaddrinfo(SERVERINFO);

listen( ListenSocket, SOMAXCONN )

while(true)
{
    if(ConnectionSocket = accept(ListenSocket, NULL, NULL))
    {
                  //do stuff
    }
}
4

1 に答える 1

1

あなたが貼り付けたコードがどれほど要約されているかはわかりませんが、

1) There is no place where you set destination address
2) There is no place you set destination port
3) To which port is server trying to bind?

...だから、これはまったく機能しません。さらに、エラーを処理してください-(はい、意図的にそれらを省略したと言いました)が、サーバーが接続を拒否した場合、エラー処理がそれを示しているに違いありません。それ以外の場合は正常に接続されますが、そうではないと主張します。あなたはまた言う:

1) 'the client failed to connect'
2) and later you say 'the client requests do arrive, but the server doesn't receive them'

接続できる場合は、3 ウェイ ハンドシェイク (TCP ストリーム接続) が表示されるはずです。エラー処理とwiresharkではない場合、それが表示されます。クライアントのリクエストは届くが、コードは何も送信していない (送信コードが利用できない) と言います。サーバーがそれらを受信しないとも言います-接続して何かを送信すると、エラー処理が何も表示せず、サーバーが何も受信しない方法はありません(ただし、サーバーコードには受信ルーチン呼び出しがありません)。

現時点では、それについて多くの支援を受けることはできないと思います。コードを更新し、実際にローカルで動作するかどうかを確認し (ここでループバックを意味しますか?)、「ローカルではない」テストを行い、エラー処理を追加し、クライアント側とサーバー側の両方で Wireshark を使用します。

于 2013-10-07T20:30:03.733 に答える