本篇介绍一些Linux网络编程相关内容.
1.网络编程
不同主机的进程之间的通信
以下是网络编程的常识
(1)ISO模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
(2)简化版本:物理层,数据链路层,网络层,传输层,应用层(即将会话层,表示层,应用层统称为应用层)
(3)协议:每层完成哪些具体工作都有详细的规定即成为协议,每一层对应的协议
应用层:httpftppop3smtp传输层:TCP,基于链接的传输控制协议UCP,数据报传输协议网络层:IPIPv4IPv6ARP(地址解析)数据链路层:PPP点对点协议物理层:RJ-45,水晶头
(4)协议簇:单个协议功能有限,通常会把多个协议组成一个协议簇/协议族,会以该协议簇的主体协议命名
TCP/IP协议族
(5)IP地址:计算机中的网卡在网络中的唯一标识,网络中的计算机可以用IP地址来表示
IP地址的表示方式:点分十进制IPv4:32bit数据表示IPIPv6:128bit数据表示IPifconfig:查看、配置网卡的IPsudoifconfig:察看:将IP改为192.168.1.8ping:察看网络是否连通(DNS)120.132.68.230DNS:域名解析会把该字符串对应的IP地址找到
(6)端口号:本质上是一个非负的short(0~65535)
代表计算机上的一个对外通信的进程
端口号中大部分没被使用,有少部分端口是被占用的
0~1023:系统预留的,编程时最好不要使用1024~4.8万:可以随意使用oracle(1521)4.8万~65535:系统随时可能征用,最好不要使用http:80号端口ftp:21号端口telnet:23号口
(7)网络字节序
大端模式:权重大的在低位地址
小端模式:权重小的在低位地址
inta=0x12345678地址:0x1000x1010x1020x103大端模式:12345678小端模式:78563412
网络通信过程中规定数据传输时采用大端模式,int/long/short都存在字节序的问题,如果本机是小端模式,那么数据传输需要改成大端模式
存储时按大端存储还是小端存储是由硬件CPU决定的,不同的CPU在处理数据的方式是不一样的
编程判断当前主机使用的是大端模式还是小端模式
解决方法一:
inta=0x12345678;char*p=(char*)a;if(*p==0x12)printf("大端");
解决方法二:
union{inta;charc[4];}test;=1;if(c[0]==1)printf("小端");
2.socket编程
linux/unix在网络功能上设计得非常强大,而且历史悠久,因此有一个非常固定的编程模式
2.1本地通信
使用方式和TCP/UDP通信类似,不同之处在于一些参数的选定
2.2基于TCP的网络编程
TCP协议是一个基于连接的协议,在网络数据交互过程中,服务器端要和客户端保持连接,不能断开,如果在传输过程中出错,会重发出错的数据,保证数据的完整性和顺序性
优点:通信的可靠性强
缺点:资源的消耗比较大
2.2.1编程步骤:
2.2.2相关API
(1)scoket()函数
intsocket(intdomain,inttype,intprotocol);domain:指定该通信终端使用的协议族AF_UNIX/AF_LOCAL/AF_FILE:都是用于本地通信AF_INET:通信协议使用的是IPv4(主要使用的)AF_INET6:通信协议使用的是IPv6注意:AF换成PF,效果是一样的type:选择通信的类型,主要包括:SCOK_STREAM,SOCK_DGRAMSOCK_STREAM,使用的是TCP协议SOCK_DGRAM,使用的是UDP协议protlcol:本来是用来指定通信协议的,现在基本废弃了一般给0就可以了返回值:成功返回一个socket描述符,失败返回-1,错误信息存于errno
(2)bind()函数
intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen);sockfd:socket描述符,socket函数的返回值addr:通信的地址(电话号码)structsockaddr,只是傀儡,实际使用的下面的两个结构体structsockaddr_un,本地通信,使用该结构structsickaddr_in,网络通信,使用该结构(重点)structsickaddr_in{sin_famliy;//用于指定协议族,和socket函数内指定的第一个参数相同保持一致就可以了sin_port;//端口号structin_addrsin_addr;//结构体类型in_addr的变量sin_addr}定义在netinet/:传递的字符长度返回值:成功返回0,失败返回-1,错误信息存于errno
(3)字节序的转换函数
htons/ntohs/htonl/ntohl用于字节序的转换
(4)inet_aton函数
intinet_aton(constchar*cp,structin_addr*inp);作用:将一个字符串IP地址转换为一个32位的网络序列IP地址cp:IP地址字符串表示表示形式"127.0.0.1"inp:存放cp的转换结果char*inet_ntoa(structin_addr);作用:把IP地址转换成字符串形式
(5)listen()函数
intlisten(intsockfd,intbacklog);sockfd:将sockfd标识的套接字标识为被动模式hackllog:侦听队列的长度返回值:成功返回0,失败返回-1,错误信息存于errno
(7)accept()函数
intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);accept函数:提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符sockfd:socket()函数创建的scoket描述符addr:记录连接请求的发起者的地址addrlen:记录连接请求的发起者的地址的长度,即指定addr的长度返回值:成功返回用于和客户端通信的新创建的sockfd(socket描述符),失败返回-1,错误信息存于errno
addr和addrlen两个参数一定不能为空,记录连接者的信息
如果该函数调用时没有客户端连接,该函数阻塞等待,直到由客户端连接为止
(8)connect函数
intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);sockfd:使用的套接字描述符,socket描述符addr:要连接的目标主机的IP端口和协议addrlen:addr的长度返回值:成功返回0,失败返回-1,错误信息存于errno
客户端和服务器都是本机的时候127.0.0.1,客户端和服务器没有在同一台机器,服务器编程是需要指定自身IP
(9)接收/发送数据的函数
ssize_trecv(intsockfd,void*buf,size_tlen,intflags);sockfd:accept()函数返回的socket描述符buf:收到的数据写入的位置len:期望受到的数据长度flags:控制接收数据的动作默认取0,代表阻塞接受,没有接受到数据就阻塞等待返回值:0,实际接受的数据长度0,出错=0,对方挂机,客户端关闭socket描述符
recv()函数可以用read()替代
ssize_ts(intsockfd,constvoid*buf,size_tlen,intflags);sockfd:accept()函数返回的socket描述符buf:要发送的数据的首地址len:要发送的数据的长度flag:控制发送数据的动作默认取0,阻塞等待返回值:成功返回成功发送额字节数,失败返回-1,错误信息存于errno
s()函数可以用write()替代
(10)getsockopt/setsockopt函数
getsockopt/setsockopt函数用于设置获取socket状态
2.3基于UDP的网络编程
UDP协议是一个无连接协议,在网络数据交互中不保持链接,只需要在发送的时候连接一下
优点:资源消耗少
缺点:数据的完整性和可靠性得不到保证
2.3.1编程步骤
2.3.2API
udp相关API与tcp是相同的,只是一些参数的取值不同
recvfrom函数替换recv函数
ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,structsockaddr*src_addr,socklen_t*addrlen);sockfd:socket()创建的描述符,socket描述符buf:接受数据写入位置len:期望接收的字节个数lfags:接受动作的控制,一般给0,阻塞接收src_addr:数据源的地址信息,可以从该参数获取到数据是谁发出的addrlen:src_addr的长度,也是一个传出参数返回值:0,实际接收的字节个数0,出错
sto函数替换s函数
ssize_tsto(intsockfd,constvoid*buf,size_tlen,intflags,conststructsockaddr*dest_addr,socklen_taddrlen);sockfd:socket()创建的描述符,socket描述符buf:发送的数据len:期望发送的字节个数lfags:接受动作的控制,一般给0,阻塞dest_addr:数据发送的目标地址和端口addrlen:dest_addr的长度返回值:成功返回实际发送的字节数,失败返回-1,错误信息存于errno
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。