通过环回适配器在同一套接字上发送数据报(UDP)winsocket和recvfrom的C++问题



我正试图用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), '', 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 %sn", 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;
}

您将服务器套接字绑定到端口0,即要求操作系统为其分配随机端口号。这必须与您发送到的端口相同,在您的情况下为27015

此外,您不必对INADDR_ANY进行字节交换。

最新更新