c++ 桥接网络模式无法路由数据包

4uqofj5v  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(183)

我想从我的主机发送udp数据包到我的虚拟机。我的代码没有显示错误,但是wireshark没有捕获到我的虚拟机中的数据包。下面是我的代码

#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>
#include<Ws2tcpip.h>
#include<iostream>
#include<tchar.h>
#define IN_PORT 8888
#define OUT_PORT 50

#pragma comment(lib,"ws2_32.lib") //Winsock Library
// to run use command gcc flood.cpp -lwsock32 -lstdc++
int main(){
    SOCKET s;
    struct sockaddr_in src,dst;
    WSADATA wsa;
    long long count = 0;
    const char* srcIP = "192.168.137.1";
    const char* dstIP = "192.168.137.71";
    const char* pkt = "This is a Probe";
    //Initialise winsock
    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    src.sin_family = AF_INET;
    src.sin_addr.s_addr = inet_addr(srcIP);
    src.sin_port = htons(IN_PORT);
    
    dst.sin_family = AF_INET;
    dst.sin_addr.s_addr = inet_addr(dstIP);
    dst.sin_port = htons(OUT_PORT);

    if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
    {
        printf("socket() failed with error code : %d" , WSAGetLastError());
        exit(EXIT_FAILURE);
    }

    if( bind(s ,(struct sockaddr *)&src , sizeof(src)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d" , WSAGetLastError());
        exit(EXIT_FAILURE);
    }

    if (sendto(s, pkt, strlen(pkt), 0, (struct sockaddr*) &dst, sizeof(dst)) == SOCKET_ERROR)
    {
        printf("sendto() failed with error code : %d" , WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    closesocket(s);
    WSACleanup();
    return 0;
}

我的命令:gcc洪水. cpp-lwsock 32-lstdc++
Update 1:我使用virtualbox。我的虚拟机是windows server 2019,防火墙被禁用。我使用的是桥接网络设置。我的主机和客户端可以互相ping通。我的主机上的wireshark无法捕获任何数据包。
Update 2:我刚看到一个阿普数据包,询问我的虚拟机IP是每次我执行程序发送。看来路由不成功,因此,使udp数据包无法定位的目的地。可能是什么情况?

x6yk4ghg

x6yk4ghg1#

在您的主机上使用wireshark查看您的代码是否确实将数据包发送到所需地址。
然后检查您是否正在向您的虚拟机地址发送数据包。例如,要在VirtualBox机器上进行检查,请在网络设置中查找地址,如下图所示

接下来,您可能有NAT的网络接口,因此当您向其发送数据包时,默认情况下会丢弃该数据包。您需要将网络接口更改为bridge mode或将端口转发设置为described here

相关问题