1.1. <sys/types.h>
primitive system data types(包含很多类型重定义,如pid_t、int8_t等)
1.2. <sys/socket.h>
//与套接字相关的函数声明和结构体定义,如socket()、bind()、connect()及struct sockaddr的定义等
int setsockopt(int s,int level,int optname,const void *optval,,socklen_toptlen);
用来设置参数s所指定的socket状态。参数level代表欲设置的网络层,一般设成SOL_SOCKET以存取socket层。参数optname代表欲设置的选项,有下列几种数值:
SO_DEBUG打开或关闭排错模式
SO_REUSEADDR允许在bind()过程中本地地址可重复使用
SO_TYPE返回socket形态。
SO_ERROR返回socket已发生的错误原因
SO_DONTROUTE送出的数据包不要利用路由设备来传输。
SO_BROADCAST使用广播方式传送
SO_SNDBUF设置送出的暂存区大小
SO_RCVBUF设置接收的暂存区大小
SO_KEEPALIVE定期确定连线是否已终止。
SO_OOBINLINE当接收到OOB 数据时会马上送至标准输入设备
SO_LINGER确保数据安全且可靠的传送出去。
optval代表欲设置的值,参数optlen则为optval的长度。
成功则返回0,若有错误则返回-1,错误原因存于errno。
EBADF参数s并非合法的socket处理代码。
ENOTSOCK参数s为一文件描述词,非socket。
ENOPROTOOPT参数optname指定的选项不正确。
EFAULT参数optval指针指向无法存取的内存空间。
getsockopt(取得socket状态)
int getsockopt(int s,int level,int optname,void* optval,socklen_t*optlen);
getsockopt()会将参数s所指定的socket状态返回。
参数:
optname代表欲取得何种选项状态
optval则指向欲保存结果的内存地址
optlen则为该空间的大小
level、optname请参考setsockopt()
成功则返回0,若有错误则返回-1,错误原因存于errno
EBADF参数s 并非合法的socket处理代码
ENOTSOCK参数s为一文件描述词,非socket
ENOPROTOOPT参数optname指定的选项不正确
EFAULT参数optval指针指向无法存取的内存空间
1.3. <sys/ioctl.h>
//I/O控制操作相关的函数声明,如ioctl()
1.4. <stdlib.h>
/某些结构体定义和宏定义,如EXIT_FAILURE、EXIT_SUCCESS等
1.5. <netdb.h>
定义主机的各项环境,包括结构hostent(主机环境), hostname,获得主机的信息的几个函数(gethostbyname), 如:gethostbyname()、gethostbyaddr()、herror()
某些结构体定义、宏定义,如struct hostent、struct servent、等
voidsetprotoent (int stayopen);
用来打开/etc/protocols,如果参数stayopen值为1,则接下来的getprotobyname()或getprotobynumber()将不会自动关闭此文件
void endprotoent(void);
用来关闭由getprotoent()打开的文件。
void setservent(int stayopen);
用来打开/etc/services,如果参数stayopen值为1,则接下来的getservbyname()或getservbyport()将补回自动关闭文件。
void endservent(void);
用来关闭由getservent()所打开的文件。
1.6. <unistd.h>
read,write,close
1.7. <poll.h>
//poll,pollfd
1.8. <net/ethernet.h>
包括几个以太网的数据结构,ether_addr(mac帧结构),ether_header(以太帧的头部)
1.9. <netinet/in.h>
某些结构体声明、宏定义,如struct sockaddr_in、PROTO_ICMP、INADDR_ANY等
1.10. <netinet/if_ether.h>
ether_arp的数据结构
1.11. <netinet/ether.h>
以太祯的网络字节和ascii字节的转换,包括ether_ntoa(),ether_aton这样的函数定义
1.12. <netinet/ip.h>
这个头文件和linux/ip.h似乎很相似,也有iphdr的数据结构,同时还包括了timestamp结构,我的理解是,linux文件夹下的 ip.h是linux黑客编写的ip头文件,而这个则是gnu一开始就定义的头文件,同时还包括了bsd中的ipheader结构定义。同理的还有该目录下的tcp.h等文件
1.13. <linux/ip.h>
iphdr的数据结构,以及一些ip层的数据定义,同理的还有tcp.h,udp.h等等
1.14. <linux/if.h>
主要的socket头文件,似乎修改自unix的if.h,定义了网卡的接口信息的宏,例如IFF_UP.另外有数个重要的interface的数据结构定义,包括ifreq,ifconf,ifmap
1.15. <linux/if_packet.h>
原始数据包的数据结构定义,包括sockaddr_pkt,sockaddr_ll,想接收原始数据包的不能错过这个文件。同理的还有if_ppp.h,if_tun.h等等
1.16. <arpa/inet.h>
某些函数声明,如inet_ntop()、inet_ntoa()等
<fcntl.h> 文件控制
<fnmatch.h> 文件名匹配类型
<glob.h> 路径名模式匹配类型
<grp.h> 组文件
<netdb.h> 网络数据库操作
<pwd.h> 口令文件
<regex.h> 正则表达式
<tar.h> TAR归档值
<termios.h> 终端I/O
<unistd.h> 符号常量
<utime.h> 文件时间
<wordexp.h> 字符扩展类型
<arpa/inet.h> INTERNET定义
<net/if.h> 套接字本地接口
<netinet/in.h> INTERNET地址族
<netinet/tcp.h> 传输控制协议定义
<sys/mman.h> 内存管理声明
<sys/select.h> Select函数
<sys/socket.h> 套接字借口
<sys/stat.h> 文件状态
<sys/times.h> 进程时间
<sys/types.h> 基本系统数据类型
<sys/un.h> UNIX域套接字定义
<sys/utsname.h> 系统名
<sys/wait.h> 进程控制
POSIX定义的XSI扩展头文件<cpio.h> cpio归档值
<dlfcn.h> 动态链接
<fmtmsg.h> 消息显示结构
ftw.h> 文件树漫游
<iconv.h> 代码集转换使用程序
<langinfo.h> 语言信息常量
<libgen.h> 模式匹配函数定义
<monetary.h> 货币类型
<ndbm.h> 数据库操作
<nl_types.h> 消息类别
<poll.h> 轮询函数
<search.h> 搜索表
<strings.h> 字符串操作
<syslog.h> 系统出错日志记录
<ucontext.h> 用户上下文
<ulimit.h> 用户限制
<utmpx.h> 用户帐户数据库
<sys/ipc.h> IPC(命名管道)
<sys/msg.h> 消息队列
<sys/resource.h> 资源操作
<sys/sem.h> 信号量
<sys/shm.h> 共享存储
<sys/statvfs.h> 文件系统信息
<sys/time.h> 时间类型
<sys/timeb.h> 附加的日期和时间定义
<sys/uio.h> 矢量I/O操作
POSIX定义的可选头文件<aio.h> 异步I/O
<mqueue.h> 消息队列
<pthread.h> 线程
<sched.h> 执行调度
<semaphore.h> 信号量
<spawn.h> 实时spawn接口
<stropts.h> XSI STREAMS接口
<trace.h> 事件跟踪
#include <unistd.h>对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。按照惯例,UNIX shell使文件描述符0与进程的标准输入相结合,文件描述符1与标准输出相结合,文件描述符2与标准出错输出相结合。这是UNIX shell以及很多应用程序使用的惯例,而与内核无关。尽管如此,如果不遵照这种惯例,那么很多LINUX应用程序就不能工作。在POSIX.1应用程序中,幻数0、1、2应被代换成符号常数STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。这些常数和类型都定义在头文 <unistd.h>中。