原始套接字 fd 的 setsockopt() 失败

setsockopt() for a raw socket fd failed

描述:

我使用:

int syn_socket = (AF_INET, SOCK_RAW, IPPROTO_RAW);

创建一个原始套接字,我有root权限。然后:

int on = 1;
int rc = setsockopt(syn_socket, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));

setsockoptreturns-1,而errno就是EBADF。这是日志:

[ 2016-12-05 11:02:34 UTC ] [ syn.cpp:266 ] [ syn ] create raw socket (255)
[ 2016-12-05 11:02:34 UTC ] [ syn.cpp:220 ] [ send_syn_packet ] setsockopt(255) failed. (Ba d file descriptor)
[ 2016-12-05 11:02:34 UTC ] [ syn.cpp:292 ] [ syn ] send syn packet failed.

int syn_socket = (AF_INET, SOCK_RAW, IPPROTO_RAW);

正如@DaV 已经暗示的那样,这不是调用 socket()。该行中没有单词 socket。它编译,因为它仍然是有效的 C。如果你写:

int a = (1, 2, 3);

结果是a设置为值3。你的syn_socket设置为IPPROTO_RAW,相当于255,这确实很可能不是有效的描述符。

您需要致电socket():

int syn_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);