我有一个UDP连接并监听端口(本地主机),我也想从本地主机发送Scapy数据包。出于某种原因,我的C代码从来没有实际捕获数据包,但是我可以看到Wireshark中显示的数据包很好。我已经使用套接字已经有一段时间了,但是有一些特殊的套接字选项需要设置,或者为什么我能够在Wireshark中看到数据包,但不能使用C套接字?与Scapy交谈的C socket
注意:当我编写相应的套接字代码来发送数据包(来自本地主机)时,我能够成功捕获数据包,但是我仍然无法从其他计算机发送数据包时听到代码。
我发现了一个similar question但是当我尝试他们的方法(使用UDP而不是TCP)时,我仍然无法使用netcat来捕获Scapy数据包。
C代码(冷凝为了清楚起见)
int main() {
int sock, dataLen, inLen;
struct sockaddr_in inAddr;
short listen_port = 8080;
char buffer[2048];
if (sock = socket(AF_INET,SOCK_DGRAM,0) < 0) {
printf("ERROR: unable to establish socket\n");
return -1;
}
// zero out address structure
memset(&inAddr, 0, sizeof(inAddr));
inAddr.sin_family = AF_INET;
inAddr.sin_addr.s_addr = htonl(INADDR_ANY);
inAddr.sin_port = htons(listen_port);
if (bind(sock, (struct sockaddr*)&inAddr, sizeof(inAddr)) < 0) {
printf("ERROR: unable to bind\n");
return -1;
}
inLen = sizeof(inAddr);
printf("Now listening on port %d\n", listen_port);
while(1) {
dataLen = recvfrom(sock, buffer, 1500, 0, (struct sockaddr*)&inAddr, &inLen);
if (dataLen < 0)
printf("Error receiving datagram\n");
else
printf("Received packet of length %d\n", dataLen);
}
return 0;
}
Scapy的脚本
# set interface
conf.iface="lo0"
# create IP packet
ip_pkt = IP()/UDP()
ip_pkt.payload = "payload test message"
ip_pkt.dport = 8080
ip_pkt.dst = "127.0.0.1"
ip_pkt.src = "127.0.0.1"
# send out packet
send(ip_pkt)
你的本地主机上监听器将永远无法捕捉到另一台计算机发送的数据包,因为这些数据包将不会穿越的loopback您监听器 – jxh
@jxh监听器绑定到'INADDR_ANY';它依赖于系统,但从另一个地址发送数据包到127.0.0.1可能会被过滤 – bbonev
@bbonev:'Scapy脚本'指定本地主机的目标IP地址。如果该脚本在另一台机器上运行,则它无法到达侦听器的机器。 – jxh