わかりました、それは非常に奇妙な問題です。ping 要求をスプーフィングするために生のソケット ICMP パケットを作成しようとしていました。
int s;
s = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
その後
int one; // I should initialize it as 1, but I didn't.
const int *val = &one;
setsockopt(s, IPPROTO_IP, IP_HDRINCL, val, sizeof(one));
....
1 として初期化していないため、偽装されたクライアントは ping 応答を受信できないことがわかりました。ただし、追加すると
unsigned char *ch = (unsigned char *)spoof;
直前に
close(s);
、
スプーフィングされたクライアントが ping 応答を受信できることが判明しました。何故ですか?