UDP 接続が確立されており、ポート (localhost) でリッスンしています。ローカルホストからも Scapy パケットを送信しようとしています。何らかの理由で、C コードが実際にパケットをキャプチャすることはありませんが、Wireshark でパケットが正常に表示されることは確認できます。ソケットを使用してからしばらく経ちましたが、設定する必要がある特別なソケット オプションがいくつかありますか、それとも Wireshark では問題なくパケットを表示できるのに、C ソケットでは表示できないのはなぜですか?
注: (localhost から) パケットを送信するための対応するソケット コードを記述したとき、パケットを正常にキャッチできましたが、別のコンピューターから送信されたときにパケットをキャッチするためのリッスン コードをまだ取得できません。
同様の質問を見つけましたが、(TCP の代わりに UDP を使用して) 彼らのアプローチを試みたとき、まだ 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;
}
スキャピースクリプト
# 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)