1

UDP ソケットを使用してデータを送信し、Windows ループバック アダプタを介して同じソケットでデータを受信しようとしています。ネットワークのプロパティで、ループバック アダプターに次の IP 192.168.1.1 を設定しました。

recvfrom 関数は、エラーを示す -1 を返します。また、wireshark を使用してループバック アダプタのトラフィックを監視していますが、ループバック アダプタに何も送信されていないようです。トラフィックが表示されません。

Windows ではループバック アドレス (127.0.0.1) を使用できないというのは本当ですか? いくつかのフォーラムでそれを見たので、ループバック アダプターを使用しようとしています。また、自分の IP に直接送信しようとしましたが、より良い結果は得られません。ところで、彼自身のIPに送信してデータを取り戻すことは可能ですか?

助けていただければ幸いです。念のため、ソケットプログラミングは初めてです。

以下は私のコードです:

#define DST "192.168.1.1"

int _tmain(int argc, char* argv[])
{


int    numbytes;
int    bytes_sent;
int    server_sock;
char   send_msg[100];
int    send_msg_length = 100;
char   rcv_msg[100] = { 0 };
int    rcv_msg_length = 100;
int    i;

WSADATA wsaData;   
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
    fprintf(stderr, "WSAStartup failed.\n");
    return 1;
}

sockaddr_in to_addr;
sockaddr_in me;

unsigned short Port = 27015;
to_addr.sin_family      = AF_INET;
to_addr.sin_port        = htons(Port);
to_addr.sin_addr.s_addr = inet_addr(DST);

me.sin_family           = AF_INET;
me.sin_port             = 0;
me.sin_addr.s_addr      = htonl(INADDR_ANY);
memset( &(me.sin_zero), '\0', 8 );

if ((server_sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
    perror("talker: socket");
}

if ( bind( server_sock, (SOCKADDR *)&me, sizeof( me ) ) == -1)
{
    printf("Error binding/n");
    return 1;
};

int length = sizeof( to_addr );
bytes_sent = sendto(server_sock, send_msg, send_msg_length, 0, (SOCKADDR *)&to_addr, length);
if (bytes_sent == -1)
{
    perror("talker: sendto");
    exit(1);
}

printf("Sent %d bytes to %s\n", bytes_sent, DST);
printf("listener: waiting to recvfrom...\n");

if ( numbytes = recvfrom(server_sock, rcv_msg, rcv_msg_length, 0, (SOCKADDR *)&to_addr, &length ) ) 
{
    perror("recvfrom");
    exit(1);
}

closesocket(server_sock);
WSACleanup();

return 0;
}
4

1 に答える 1

2

サーバーソケットを port にバインドしています0。つまり、OS にランダムなポート番号を割り当てるように要求しています。あなたの場合、それはあなたが送信しているのと同じポートでなければなりません27015

また、 byte-swap する必要はありませんINADDR_ANY

于 2011-06-30T17:36:39.443 に答える