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

标签 c++ sockets udp winsock datagram

我正在尝试使用 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;
}

最佳答案

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

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

关于数据报 (UDP)winsocket 的 C++ 问题通过环回适配器在同一套接字上发送和接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6538707/

相关文章:

c++ - strcpy 没有在此范围内声明?

android - 在 C++ 中实现共享内存管理器

c++ - 元素计数问题

java - socket.Close() 停止程序 (java)

java - 使用 UDP 单播发送消息后从 String 转换为 Long

c++ - Qt - 计算机移动时阻止用户界面

c- valgrind(无效的 free()/delete/delete[]/realloc())套接字

.net - 触摸操作卡住了我在Windows Phone 7.1(Mango)中的udp发送

c - 在 MacO 上启用 IPV6_RECVPKTINFO

c++ - 关于使用 C++ 代码将数据从一行移动到下一行删除第一行数据