setsockopt()用于原始套接字fd失败

Cha*_*ina 1 c c++ sockets raw-sockets

描述:

我用:

int syn_socket = (AF_INET, SOCK_RAW, IPPROTO_RAW);
Run Code Online (Sandbox Code Playgroud)

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

int on = 1;
int rc = setsockopt(syn_socket, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
Run Code Online (Sandbox Code Playgroud)

setsockopt返回-1,errnoEBADF.这是日志:

[2016-12-05 11:02:34 UTC] [syn.cpp:266] [syn]创建原始套接字(255)
[2016-12-05 11:02:34 UTC] [syn.cpp:220] [ send_syn_packet] setsockopt(255)失败.(Ba d文件描述符)
[2016-12-05 11:02:34 UTC] [syn.cpp:292] [syn]发送syn包失败.

G. *_*pen 7

int syn_socket = (AF_INET, SOCK_RAW, IPPROTO_RAW);
Run Code Online (Sandbox Code Playgroud)

正如@DaV已经暗示的那样,这不是在呼唤socket().socket那条线上没有这个词.它编译,因为它仍然有效C.如果你写:

int a = (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

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

你需要打电话socket():

int syn_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
Run Code Online (Sandbox Code Playgroud)