浅谈Linux下Socket选项设置

0.前言 TCP/IP协议栈是Linux内核的重要组成部分和网络编程的基石,虽然Linux和BSD有很大的联系,但是对于某些Socket选项和内核操作仍然存在差异,因此文中适用场景均为仅Linux。 《UNIX网络编程》是已故UNIX网络专家W. Richard Stevens博士(1951-1999)、世界著名网络专家Bill Fenner和Andrew M. Rudoff完成的权威著作,该书对网络编程进行全面而深入的阐述,是提高网络编程功力的不二之选。 1.Socket和TCP/IP的关系 “All problems in computer science can be solved by another level of indirection.” 为满足应用层需求,系统对TCP/IP层进行细节屏蔽和抽象,Socket层就相当于TCP/IP和应用层之间的中间层。 常用的socket/bind/accept/connect就是抽象出来的接口,使用它们可以快速进行网络程序开发,可见Socket中间层的重要性。 Socket选项就是为满足用户的定制化需求而生的。我们经常遇到的情况包括地址复用、端口复用、读写超时时间、读写缓冲区大小等。 在Linux的TCP/IP协议栈中包括很多Socket选项,它们会出现在TCP层、IP层、Socket层等,为此在读取和设置socket选项时需要指定level。 如图可以看到Socket层作为中间层以及各层支持的部分Socket选项: 注:可通过man 7 tcp/man 7 ip查看tcp/ip各层Socket选项详细定义和添加内核版本等信息。   2.操作Socket选项的API 读取和设置Socket选项的API包括: getsockopt、setsockopt、fcntl、ioctl等; 其中fcntl和ioctl用来设置socket的阻塞和非阻塞状态。 通过man获得的函数定义: //ioctl函数定义 #include <sys/ioctl.h> int ioctl(int d, int request, …); //fcntl函数定义 #include <unistd.h> #include <fcntl.h> int fcntl(int fd,… Continue reading 浅谈Linux下Socket选项设置