3

私は現在、2人のユーザーがwinsockライブラリを使用して相互に通信できるUDPアプリケーションに取り組んでいます。現在、私のプログラムを実行すると、最初にsockaddressがベクターに保存され、次にユーザーがメッセージを送信すると、そのアドレスがベクターの最初のアドレスと比較されます。デバッグして比較する値を比較すると、それらはまったく同じですが、ifステートメントがelseになります(アドレスが互いに等しくないと考えられます)

これは私が持っているコードです:

#include <WinSock2.h>

sockaddr    clientAddress;

recvfrom( hSocket, msg, MAXLINE, 0, &clientAddress, &cbClientAddress );

myVector.pushback(clientAddress);

if (&clientAddresses[0] == &clientAddress)
{
//is the same address
}
else
{
//not the same address
}

.sa_data私はまた、後clientAddress[0]とを使用してより具体的にしようとしました&clientAddress.

ありがとう

4

1 に答える 1

1

複数の問題:

  • を呼び出す前に、次のように、 (タイプの)を受信する準備ができているアドレス情報のバイト数にrecvfrom初期化する必要があります。cbClientAddresssocklen_t

     struct sockaddr clientAddress;
     socklen_t cbClientAddress;
    
     cbClientAddress = sizeof(clientAddress);
     recvfrom(hSocket, msg, MAXLINE, 0, &clientAddress, &cbClientAddress);
    
  • 通話後、cbClientAddress受信したアドレスの実際の長さで上書きされます。これはより短くなりsizeof(struct sockaddr)ます。sizeof(struct sockaddr_in)実際、これはUDP / IPソケットであるため、に等しくなります。

  • 構造全体ではなく、実際にデータを含む構造の一部のみを比較する必要があります。struct sockaddr_in構造の未使用部分(とのサイズの違いstruct sockaddr)はゴミである可能性があります。あなたはそれを比較したくありません。これには、構造自体の内容をベクトルに記憶するだけでなく、かなりの長さも記憶する必要があります。

  • 保存したアドレスを受け取ったばかりのアドレスと比較するときは、この種の擬似コードを使用してください。構造全体(後続の未使用部分を含む)を比較しようとしないでください。

    if (
        (saved_length == this_length) &&
        (memcmp(saved_sockaddr, this_sockaddr, this_length) == 0)
    ) {
        it's a match
    }
    
  • コード&clientAddresses[0] == &clientAddressは、構造体のアドレスが等しいかどうかをチェックします。これは、必要なものではなく、同じ構造であるかどうかをテストしていることを意味します。つまり、同じ内容の構造であるかどうかをテストしています。memcmp上記の擬似コードに従って、内容を比較します。

于 2012-04-10T00:14:57.270 に答える