原始套接字 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));
setsockopt
returns-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);
描述:
我使用:
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));
setsockopt
returns-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);