服务器的原始套接字响应,c++ - 使用原始套接字,只有在使用环回接口时,我才会收到 - 堆栈内存溢出...

在Macbook上的Ubuntu虚拟机中,开发者遇到一个问题:使用原始套接字通过NAT、仅限主机和桥接接口无法接收数据,只有环回接口可以。已确认数据通过其他接口发送,但无法被接收。tcpdump显示了接口的流量,但原始套接字配置似乎只适用于环回接口。开发者寻求解决在非环回接口上接收数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在Macbook主机上使用Ubuntu 16.04在虚拟机上 (使用virtualbox)工作。

在虚拟机中,我有4个网络接口:

-NAT接口(默认接口)

- 仅限主机的界面

- 桥接接口

- 环回接口

他们都处于混杂模式。

我需要使用原始套接字来发送和接收数据。

我像这样设置原始套接字:(从输入中读取接口名称)

#define ETH_TYPE 0x4148

unsigned char* interface = "..."; /* INTERFACE NAME FROM INPUT */

int raw_socket = 0; // Socket descriptor

struct sockaddr_ll socket_address;

struct ifreq ifr;

int ifindex = 0; /*Ethernet Interface index*/

/*Broadcast address - all 1's*/

unsigned char bcast_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

/* Open socket */

raw_socket = socket(PF_PACKET, SOCK_RAW, htons(ETH_TYPE));

if (raw_socket == -1)

{

perror("socket():");

exit(1);

}

/*Get ethernet interface index*/

strncpy(ifr.ifr_name, (const char*) interface, IFNAMSIZ);

if (ioctl(raw_socket, SIOCGIFINDEX, &ifr) == -1)

{

perror("SIOCGIFINDEX");

exit(1);

}

ifindex = ifr.ifr_ifindex;

/*retrieve corresponding MAC*/

if (ioctl(raw_socket, SIOCGIFHWADDR, &ifr) == -1)

{

perror("SIOCGIFINDEX");

exit(1);

}

/*prepare sockaddr_ll*/

socket_address.sll_family = PF_INET;

socket_address.sll_protocol = htons(ETH_TYPE);

socket_address.sll_ifindex = ifindex;

socket_address.sll_pkttype = PACKET_BROADCAST;

socket_address.sll_halen = ETH_ALEN;

socket_address.sll_addr[0] = bcast_mac[0];

socket_address.sll_addr[1] = bcast_mac[1];

socket_address.sll_addr[2] = bcast_mac[2];

socket_address.sll_addr[3] = bcast_mac[3];

socket_address.sll_addr[4] = bcast_mac[4];

socket_address.sll_addr[5] = bcast_mac[5];

socket_address.sll_addr[6] = 0x00;

socket_address.sll_addr[7] = 0x00;

我发送 :

void socketSend(string network_string)

{

sendto(raw_socket, network_string.data(), network_string.length(), 0, (struct sockaddr*) &socket_address, sizeof (socket_address));

}

并收到 :

unsigned char* buffer_incoming = new unsigned char[ETHER_MAX_LEN];

recvfrom(raw_socket, buffer_incoming, ETHER_MAX_LEN, 0, NULL, NULL);

问题是仅在使用环回接口时才收到。

如果我使用其他3个接口中的任何一个作为接口,则可以发送但不接收。

我知道它发送,因为使用tcpdump可以看到来自指定接口的流量。

有没有办法可以使用其他接口之一?

因为我需要将流量从一台机器发送到另一台机器,所以我认为环回接口对我来说毫无用处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值