您好,欢迎访问三七文档
LINUX网络编程基础大纲网络基础协议基本网络编程典型用法网络库介绍常用网络工具网络编程注意事项网络通信InternetHello!ISO模型物理层物理层数据链路层数据链路层网络层网络层传输层传输层会话层会话层表示层表示层应用层应用层物理层协议数据链路层协议网络层协议传输层协议会话层协议表示层协议比特帧报文TPDUSPDUPPDUAPDU1接口2接口3接口4接口5接口6接口主机A主机B数据单元层TCP/IP模型对比ISO模型网络接口层互联网层传输层应用层TCP/IP4层模型物理层数据链路层网络层OSI7层模型会话层表示层应用层传输层互联网层传输层应用层物理层数据链路层TCP/IP5层模型OSI和TCP/IP协议栈对比OSI中的层功能TCP/IP协议族应用层文件传输,电子邮件,文件服务,虚拟终端TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet表示层数据格式化,代码转换,数据加密NA会话层解除或建立与别的接点的联系NA传输层提供端对端的接口TCP,UDP网络层为数据包选择路由IP,ICMP,RIP,OSPF,BGP,IGMP数据链路层传输有地址的帧以及错误检测功能SLIP,CSLIP,PPP,ARP,RARP,MTU物理层以二进制数据形式在物理媒体上传输数据ISO2110,IEEE802。IEEE802.2IP地址使用IP协议通讯的主机都有IP地址在计算机中,IPv4地址用一个32位无符号整数表示192.168.2.1192.168.2.10端口号TCP/UDP协议使用16位整数存储端口号,所以每个主机拥有65,535个端口端口的作用就是用来标识某台机器系统上的程序一些端口被IANA分配给指定应用21:FTP23:Telnet80:HTTP一般认为0-1023端口保留RFC1700(大约有2000个保留端口)Port0Port1Port65535用户数据进入TCP/IP协议栈的封装过程网络数据帧分用获取用户数据过程数据的封装与传递过程问题Q:网口和IP地址是否是一一对应关系?Q:Linux和windows下查看IP地址的命令?SOCKET介绍在Linux下,所有的I/O操作都是通过读写文件描述符而产生的,文件描述符是一个和打开的文件相关联的整数,而套接口就是系统进程和文件描述符通信的一种方法,目前最常用的套接口:字节流套接口和数据报套接口、原始套接口。SOCKET介绍常用网络函数socketsetsockoptbindlistenconnectacceptsend/recvsendto/recvfromclosehtonsntohshtonlntohlinet_ptoninet_ntopSOCKET函数描述创建一个套接字函数原型#includesys/types.h#includesys/socket.hintsocket(intdomain,inttype,intprotocol);返回值成功:非负文件描述符失败:-1,由errno返回错误原因GETSOCKOPT/SETSOCKOPT函数描述获取/设置socket属性。函数原型#includesys/types.h#includesys/socket.hintgetsockopt(ints,intlevel,intoptname,void*optval,socklen_t*optlen);intsetsockopt(ints,intlevel,intoptname,constvoid*optval,socklen_toptlen);返回值成功:0失败:-1,由errno返回错误原因BIND函数描述为套接口分配一个本地的IP和端口号。函数原型#includesys/types.h#includesys/socket.hintbind(intsockfd,conststructsockaddr*my_addr,socklen_taddrlen);返回值成功:0失败:-1,由errno返回错误原因LISTEN函数描述在指定套接字上侦听客户端连接。函数原型#includesys/socket.hintlisten(intsockfd,intbacklog);返回值成功:0失败:-1,由errno返回错误原因ACCEPT函数描述在指定侦听socket上,接收一个连接。函数原型#includesys/types.h#includesys/socket.hintaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);返回值成功:非负文件描述符失败:-1,由errno返回错误原因CONNECT函数描述连接到指定的IP地址。函数原型#includesys/types.h#includesys/socket.hintconnect(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlen);返回值成功:0失败:-1,由errno返回错误原因CLOSE函数描述关闭文件描述符(socket套接字)。函数原型#includesys/types.h#includesys/socket.hintclose(intfd);返回值成功:0失败:-1,由errno返回错误原因RECV/RECVFROM函数描述从socket套接字接收消息。函数原型#includesys/types.h#includesys/socket.hssize_trecv(ints,void*buf,size_tlen,intflags);ssize_trecvfrom(ints,void*buf,size_tlen,intflags,structsockaddr*from,socklen_t*fromlen);返回值成功:接收字符个数失败:-1,由errno返回错误原因;0,对端正常断开SEND/SENDTO函数描述向socket套接字发送消息。函数原型#includesys/types.h#includesys/socket.hssize_trecv(ints,void*buf,size_tlen,intflags);ssize_trecvfrom(ints,void*buf,size_tlen,intflags,structsockaddr*from,socklen_t*fromlen);返回值成功:0失败:-1,由errno返回错误原因UDP网络通信UDP服务器#includesys/socket.h…intmain(intargc,char**argv){…;listenfd=socket(AF_INET,SOCK_DGRAM,0);//创建侦听端口//初始化服务地址bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;inet_pton(AF_INET,servInetAddr,&servaddr.sin_addr);servaddr.sin_port=htons(serverPort);//绑定到UPD侦听端口bind(listenfd,(structsockaddr*)&servaddr,socklen);for(;;){//接收数据recvLen=recvfrom(listenfd,recvBuf,2048,0,(structsockaddr*)&cliAddr,&cliAddrLen);printf(clientIP=%s\n,inet_ntoa(cliAddr.sin_addr));//将接收到的数据回送到客户端sendto(listenfd,recvBuf,recvLen,0,(structsockaddr*)&cliAddr,cliAddrLen);}return0;}UDP客户端#includesys/socket.h…intmain(intargc,char**argv){…;listenfd=socket(AF_INET,SOCK_DGRAM,0);//创建侦听端口//初始化服务器地址bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;inet_pton(AF_INET,servInetAddr,&servaddr.sin_addr);servaddr.sin_port=htons(serverPort);for(;;){fgets(sendline,MAXLINE,stdin);//从标准输入读取数据//发送数据sendto(connfd,sendline,strlen(sendline),0,(structsockaddr*)&servaddr,addrLen);//接收数据n=recvfrom(connfd,recvline,MAXLINE,0,(structsockaddr*)&servaddr,&addrLen);//接收数据回写到标准输出write(STDOUT_FILENO,recvline,n);}return0;}TCP网络通讯TCP客户端#includesys/socket.h…intmain(){…connfd=socket(AF_INET,SOCK_STREAM,0);//创建套接字servaddr.sin_family=AF_INET;servaddr.sin_port=htons(servPort);inet_pton(AF_INET,servInetAddr,&servaddr.sin_addr);//连接到server服务器connect(connfd,(structsockaddr*)&servaddr,sizeof(servaddr));//处理接收socket套接字handle(connfd);//关闭套接字close(connfd);return0;}voidhandle(intsockfd){for(;;){if(fgets(sendline,MAXLINE,stdin)==NULL){break;}//发送n=write(sockfd,sendline,strlen(sendline));//接收n=read(sockfd,recvline,MAXLINE);if(n==0){break;}write(STDOUT_FILENO,recvline,n);}}TCP服务器#includesys/socket.h…intmain(){…//创建侦听端口listenfd=socket(AF_INET,SOCK_STREAM,0);//初始化侦听服务地址bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=htons(serverPort);//绑定到侦听端口bind(listenfd,(structsockaddr*)&servaddr,socklen);listen(listenfd,listenq);//开启侦听for(;;){//接收到客户端连接connfd=accept(listenfd,(structsockaddr*)&cliaddr,&socklen);//处理接收句柄handle(connfd);}return0;}voidhandle(intfd){…;for(;;){//从socket接收数据n=read(connfd,buf,MAXLINE);if(n0){break;}//读取异常if(n==0){break;}//对端断开if(strncmp(exit,buf,4)
本文标题:LINUX网络编程
链接地址:https://www.777doc.com/doc-6040310 .html