这周学习了linux网络编程相关的知识,如今将其总结以下:linux
在linux系统中已经将TCP/IP协议相关的东西都封装好了,因此在入门学习网络编程的时候并无学习研究太多TCP/IP协议的东西,而是学习那些已经将协议封装好的函数和API。编程
在linux网络编程中基本几个函数以下:缓存
第一个函数:套接字建立函数
服务器
该函数功能是建立一个套接字,各参数含义及函数用法以下网络
参数_domain表示建立的套接字使用的协议族,其主要取值有:dom
AF_UNIX:建立一个只在本机内进行通讯的套接字socket
AF_INET:使用IPv4 TCP/IP协议函数
AF_INET6:使用IPv6 TCP/IP协议学习
参数_type表示套接字的类型,能够有以下取值:spa
SOCK_STREAM:建立一个TCP套接字
SOCK_DGRAM:建立UDP套接字
SOCK_RAM:建立一个原始套接字
参数_protocol一般设置为0,表示经过参数_domain制定的协议族和参数_type指定的套接字类型来肯定使用的协议。当建立原始套接字时,系统没法惟一地肯定协议,此时就须要使用该参数指定所使用的协议。
函数执行成功返回新建立的套接字,失败返回-1,错误代码存入errno中。
第二个函数:创建链接函数
该函数的功能是在指定的套接字上建立一个链接。各参数含义及用法以下
参数__fd是由socket()函数建立的一个套接字,若是该套接字类型是SOCK_STREAM,则connect函数用于向服务器发出链接请求。服务器的IP地址和端口号由参数__addr参数指定,上图中__addr所对应的数据类型是const struct socketaddr *。若是套接字类型是SOCK_DGRAM则调用connect函数并不真正创建链接而只是告诉内核与该套接字进行通讯的目的地址(的第二个参数指定),只有该目标地址发来数据时才会被该socket接收。对于SOCK_DGRAM的好处在于没必要每次发送数据时都指定目的地址。__len参数表示第二个地址参数的大小。
该函数在使用时须要注意:若是是TCP常链接选项的话只可以调用一次connect函数创建链接,而对于无链接的UDP来讲能够屡次调用该函数来改变发送数据的目标地址。
第三个函数:绑定端口函数
该函数是将一个端口绑定在某个套接字上,这个函数经常使用在服务器端。其中__fd表示要绑定的套接字描述符,__addr表示要绑定的IP,__len表示要绑定的IP长度,通常用sizeof计算。
第四个函数:监听函数
该函数是将一个套接字转化为监听套接字,经常使用于服务器端监听来自客户端的链接请求。第一个参数__fd表示监听套接字描述符,第二个参数表示最大监听的个数。
第五个函数:接受链接函数
这个函数的功能是接收来自监听套接字上的请求,__fd是一个监听套接字,__addr用来保存发起链接的主机的端口号和IP,与上两个函数中的__addr类型相同,__addr_len是__addr所指向的长度,通常使用sizeof计算达到。
该函数返回一个套接字,返回的套接字就是和客户端创建链接的客户端。
第六个函数:发送数据函数
创建链接的目的就是发送数据,linux中发送数据提供了两个函数,一个用于使用TCP来发送数据,一个使用UDP发送数据,这里总结TCP发送数据的函数,由于UDP发送数据的函数和TCP的int sendto(int __fd, const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)只是多了发送的目标ID和目标ID的长度。
该函数是使用TCP发送数据,__fd表示创建起链接的套接字(accept函数返回的套接字而非listen函数中的套接字),
__buf表示要发送的数据缓存区地址,__n表示发送数据的长度,__flags表示控制选项,通常取0或者如下值:
MSG_OOB:在指定套接字上发送带外数据(所谓带外数据就是指链接双方中的一方发生重要的事情,想要迅速通知对方,这种通知在已排队等待的任何“普通”数据以前发送。带外数据的发送优先级更高,带外数据是映射进现有链接中而不须要从新链接)
MSG_DONTROUTE:经过最直接路径发送数据,而忽略下层协议的路由设置。
第七个函数:接收数据
linux中提供了TCP接收函数和既能接收TCP又能接收UDP数据的接收函数。
二者都能接收的函数为:
该函数的__fd参数表示链接套接字,__restrict __buf表示接收缓存区,__n表示接收缓存区的大小,__flags通常为0其他取值以下:
MSG_OOB:在指定套接字上发送带外数据
MSG_PEEK:之查看数据而不读出数据
MSG_WAITALL:只在接收数据缓存区满的时候才返回。
若是该函数的__addr非空则表示不是面向链接的,__addr_len在调用前表示__addr的长度,调用后将表示__addr的实际大小。
只能接收TCP的函数为:
extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);该函数只能用于常链接,函数的参数和上边那个函数差很少,少了最后两个参数。
打个比方来理解这些函数的工做吧,服务器就至关于公司的老板(boss),客户端至关于公司的员工,bind函数至关于给老板分配一个办公室,listen函数表示老板在办公室坐在窗边喝着茶等着员工来找他办事,connect函数表示员工主动去找老板谈加工资的事情,accept函数至关于老板将谈工资这个事情分配给了管工资的小老板,而后员工(客户端套接字描述符)和小老板(accept函数返回的套接字)开始了谈工资的工做,而接收函数和发送函数一个能够当作说话一个能够当作听话。