感言:
以及到了大四依然不敢说自己懂得socket这是一个功能强大用途广泛的系统调用。
什么是socket:
linux平台下的网络编程通过socket函数创建网络套接口,这犹如文件读取时的文件套接口一样。套接口即为一个标识,通过该套接口操作所有关于该连接的所有操作。
如何编写一个tcp网络传输的demo:
服务器: 客户端:
1.套接口fd = socket(); 1.套接口fd = socket();
2.bind();//绑定套接口和ip&&端口 2.connect()
3.listen() ; 3.write()/read()
4.accept(); 4.close()
5.write()/read()
6.close()
再探socket:
int Socket(int family, int type, int protocol)
返回-1出错,非负值成功
Family代表一个协议簇,系统中存在很多协议簇:
AF_INET指定ipv4 AF_INET6 指定ipv6 AF_LOCAL 指定UNIX协议域
AF_ROUTE路由套接字 AF_KEY密钥套接字
Type 只一个套接口 的协议类型
SOCK_STREAM指字节流 SOCK_DGRAM指数据报 SOCK_SEQPACKET有序分组
SOCK_RAW原始套接字
Protocol代表相应的传输协议
IPPROTO_TCP tcp协议 IPPROTO_UDP udp传输协议 IPPROTO_SCTP sctp传输协议
Socket提供了一些选项主要由setsockopt和getsockopt函数完成,
Int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t optlen);
Int setsockopt(int sockfd, int level, int optname, const void optval, socklen_t optlen);
例子:
设置socket套接字能够复用地址:
setsocket(socketfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
SO_REUSEADDR代表地址复用:
一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。
SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket(TCP连接中,先调用close()的一方会进入TIME_WAIT状态),才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。
SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。
SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。
SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。
SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。
设置socket套接字keeplive:
设置tcp socket:禁用纳格算法
设置tcp socket:禁用delay ack(需要每次recv后调用)
socket选项列表
int Socket(int family, int type, int protocol)
返回-1出错,非负值成功
Family代表一个协议簇,系统中存在很多协议簇:
AF_INET指定ipv4 AF_INET6 指定ipv6 AF_LOCAL 指定UNIX协议域
AF_ROUTE路由套接字 AF_KEY密钥套接字
Type 只一个套接口 的协议类型
SOCK_STREAM指字节流 SOCK_DGRAM指数据报 SOCK_SEQPACKET有序分组
SOCK_RAW原始套接字
Protocol代表相应的传输协议
IPPROTO_TCP tcp协议 IPPROTO_UDP udp传输协议 IPPROTO_SCTP sctp传输协议
Socket提供了一些选项主要由setsockopt和getsockopt函数完成,
Int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t optlen);
Int setsockopt(int sockfd, int level, int optname, const void optval, socklen_t optlen);
例子:
设置socket套接字能够复用地址:
setsocket(socketfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
SO_REUSEADDR代表地址复用:
一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。
SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket(TCP连接中,先调用close()的一方会进入TIME_WAIT状态),才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。
SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。
SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。
SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。
SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。
设置socket套接字keeplive:
设置tcp socket:禁用纳格算法
设置tcp socket:禁用delay ack(需要每次recv后调用)
socket选项列表