我想从我的主机发送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数据包无法定位的目的地。可能是什么情况?
1条答案
按热度按时间x6yk4ghg1#
在您的主机上使用wireshark查看您的代码是否确实将数据包发送到所需地址。
然后检查您是否正在向您的虚拟机地址发送数据包。例如,要在VirtualBox机器上进行检查,请在网络设置中查找地址,如下图所示
接下来,您可能有NAT的网络接口,因此当您向其发送数据包时,默认情况下会丢弃该数据包。您需要将网络接口更改为bridge mode或将端口转发设置为described here