底层网络编程底层的编程主要是和TCP/IP协议紧密关联的,比如设置IP头信息,设置TCP、UDP头信息,设置ICMP数据包,ARP地址解析协议等。这一切能够实现的基础就是SOCK_RAW–原始套接字。原始套接字的使用对于学习和掌握TCP/IP协议时非常有帮助的。总的来说,有两种用法:
Socket(AF_INET, SOCK_RAW, IPPROTO_TCP); // IPPROTO_UDP, IPPROTO_ICMP等
Socket(AF_INET,SOCK_RAW,ETH_P_ALL); // ETH_P_ARP ; ETH_P_RARP等
这里的第一类用法主要用在组装传输层的数据包上使用。比如组装一个ICMP数据包,用来实现Ping程序。这一层次的调用不关心ip数据头的信息,只关心ip头以上的信息。至于ip数据头以及以太网数据头的信息由系统来组装。使用sockaddr_in结构来指明组装的ip头。但是注意此时的sockaddr_in结构体中的端口号是不起作用的。另外还需要注意的是这种方法收取到的数据是没有被剥离ip头部的。必须手动进行剥离,才能读取到需要的数据。
使用这种方法虽然由系统自己组装了IP头,然而还是可以通过一定的方法来强制的设置IP头的。该方法就是setsockopt方法。如下列举:
Setsockopt(socket_fd IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl)); //设置TTL
Setsockopt(seock_fd,IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(tos)); //设置TOS服务
Setsockopt(sock_fd, IPPROTP_IP, IP_OPTIONS, ,); // 设置IP选项
Setsockopt(sock_fd, IPPROTO_IP, IP_H