28.2 Raw Socket
Creation
The steps involved in creating a raw socket are
as follows:
-
The
socket function creates a raw socket when the second
argument is SOCK_RAW. The third argument (the protocol) is
normally nonzero. For example, to create an IPv4 raw socket we
would write
int sockfd;
sockfd = socket(AF_INET, SOCK_RAW, protocol);
where protocol
is one of the constants, IPPROTO_xxx, defined by including the
<netinet/in.h> header, such as
IPPROTO_ICMP.
Only the superuser can create a raw socket. This
prevents normal users from writing their own IP datagrams to the
network.
-
The
IP_HDRINCL socket option can be set as follows:
const int on = 1;
if (setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)
error
We will describe the effect of this socket
option in the next section.
-
bind can be called on the raw socket, but this is
rare. This function sets only the local address: There is no
concept of a port number with a raw socket. With regard to output,
calling bind sets the source IP address that will be used
for datagrams sent on the raw socket (but only if the
IP_HDRINCL socket option is not set). If bind is
not called, the kernel sets the source IP address to the primary IP
address of the outgoing interface.
-
connect can be called on the raw socket, but this is
rare. This function sets only the foreign address: Again, there is
no concept of a port number with a raw socket. With regard to
output, calling connect lets us call write or
send instead of sendto, since the destination IP
address is already specified.
|