UNIX地址结构
当往一个socket函数传递上述地址结构时,所有的参数都是指针
从用户态往内核传递地址指针的三个函数bind,connect,sendto
从内核往用户态传递地址指针的三个函数accept,recvfrom,getsockname,getpeername
这样除了给你对端的地址之外还用长度隐式的告诉你连接类型
UNIX大端小端的转换
由于网络编程中都是网络字节,故需要使用转换函数
h:host主机端,n:network网络端,s:short,l:long
字符串与unix地址结构相互转化的API
inet_pton系列的函数存在一个问题,为了获得字符串我们需要定义一个struct sockaddr
由于LInux哲学中的一切皆文件的理念,进行网络编程时,第一件事就是开启网络的文件描述符socket
connect函数详解
功能:用于在客户端与服务器建立socket连接
原型为
其中fd为socket创建的描述符,返回值为与服务端通信所需要的fd,注意,客户端的这个socket不一定需要bind到一个固定的端口上,但没有bind时,将由系统分配一个端口
connect函数出现错误的情况
(1):对端没有回复SYN,此时再重试两次后(最多等待75s)返回ETIMEOUT错误
(2):对端回复RST复位,表明我们想要connect的端口不存在,是硬错误,此时将立即返回ECONNREFUSED
(3):中间的路由产生目的不可达的ICMP报文,处理方式与一类似
bind函数详解
功能:把一个套接字(ip+port)与sockfd绑定
原型为:
手册中对bind函数的作用解释是bind为一个套接字命名
如果未bind的情况下调用listen和connect,那么系统将给这个连接分配对应的端口,对于客户端来说则是常见的,对于服务端则是不常见的,这个规则的例外是RPC调用
listen函数详解
功能:1.将一个socket转为被动状态(当一个套接字fd被创建时默认是主动连接),listen注册给内核,指示内核关注该sockfd的连接请求
2.指示可以等待在该fd上的连接数(第二个参数,被称为backlog)
调用listen函数后会为sockfd建立两个队列如下图
linux上backlog参数的含义是进入EASTABLISH状态,但未被accept函数取出的数量
accept函数详解
功能:从ESTABLISH队列中取出一个连接
原型:
close函数详解
功能:主动关闭一个连接,调用后调用进程将不能再将关闭的fd作为read和write的第一个参数,但是仍然会将已经填充在TCP内核缓冲区中的数据发送给对端,然后发送FIN,注意,如果fork了子进程,那么有可能不会产生任何效果(子进程共享父进程的fd,并且将引用计数+ 1,close只是减少该进程的引用计数).而shutdown函数则会确确实实的直接发送一个FIN
getsockname和getpeername函数
功能:获取一个套接字的addr信息
原型: