Linux_Socket培训课件

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

LinuxTCP/IP编程——基于BSDSocket1.1四川大学软件学院林锋网络编程简介互联网的历史和发展ISO/OSI七层协议TCP/IP协议BekeleySocket库互联网的历史和发展1971年,ARPANET,使用NCP协议(NetworkControlProgram)1973年,放弃NCP协议,研究新协议1974年,发布TCP/IP协议和网关结构1981年,TCP/IPversion4标准确定ISO/OSI七层协议模型TCP/IP协议族TCP(TransmissionControlProtocol)传输控制协议,基于连接的服务UDP(UserDatagramProtocol)用户数据报协议,无连接的服务IP(InternetProtocol)Internet协议,信息传递机制OSI模型与TCP/IP协议的对比TCP或UDPIP和路由网卡驱动TelnetFTP编程应用Socket函数实现网络功能一些Socket编程的概念流(Stream)连接(Connection)阻塞(Block)、非阻塞(Non-block)同步(Synchronous)、异步(asynchronous)IP地址字节顺序IP地址IP地址是Internet中唯一的地址标识,IP地址是一个32位长(正在扩充到128位)每个Internet包必须带有IP地址点分十进制表示法将IP地址的4个字节的数字用十进制表示并用点隔开,如:202.115.48.148(0xCA733094)IP地址的分级子网掩码(SubnetMask)四级IP地址子网掩码也用点分十进制表示例如:255.255.0.0指明子网(局域网)的范围Mask与IP地址进行与操作即可得出子网范围例如IP地址:202.115.32.1与202.115.32.45子网掩码:255.255.254.0即可得出这两个IP地址处于同一个子网内MAC地址MAC地址是Ethernet协议使用的唯一地址MAC地址是EthernetNIC上自带的,48位长。如:00-88-D5-03-E7-A8MAC地址作用范围是Ethernet(局域网)内MAC地址存在于每一个Ethernet包中,是Ethernet包头的组成部分,Ethernet交换机根据Ethernet包头中的MAC源地址和MAC目的地址实现包的交换和传递MAC地址与IP地址无关字节顺序网络字节顺序(NBO,NetworkByteOrder)使用统一的字节顺序,避免兼容性问题主机字节顺序(HBO,HostByteOrder)不同的机器HBO不相同,与CPU设计有关Motorola68k系列,HBO与NBO相同Intelx86系列,HBO与NBO相反Socket函数介绍需要用到的头文件数据类型:#includesys/types.h函数定义:#includesys/socket.hBerkeleySocket常用函数列表网络连接函数获取/设置socket的参数或信息转换函数网络连接函数socketbindconnectlistenacceptselectrecv,recvfromsend,sendtoclose,shutdown获取/设置socket的参数或信息gethostbyaddr,gethostbynamegethostnamegetpeernamegetprotobyname,getprotobynumbergetservbyname,getservbyportgetsocknamegetsockopt,setsockoptioctl转换函数IP地址转换inet_addr()inet_ntoa()字节顺序转换htons()--HosttoNetworkShorthtonl()--HosttoNetworkLongntohs()--NetworktoHostShortntohl()--NetworktoHostLong数据结构:sockaddrstructsockaddr{unsignedshortsa_family;/*addressfamily,AF_xxx*/charsa_data[14];/*14bytesofprotocoladdress*/};此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息数据结构:sockaddr_instructsockaddr_in{shortintsin_family;/*Addressfamily*/unsignedshortintsin_port;/*Portnumber*/structin_addrsin_addr;/*Internetaddress*/unsignedcharsin_zero[8];/*Samesizeasstructsockaddr*/};该结构与sockaddr兼容,供用户填入参数数据结构:in_addrstructin_addr{unsignedlongs_addr;};这个数据结构是由于历史原因保留下来的,主要用作与以前的格式兼容。程序中实际只填写sockaddr_in结构structsockaddr_inmy_addr;my_addr.sin_family=AF_INET;my_addr.sin_port=htons(3490);/*short,NBO*/my_addr.sin_addr.s_addr=inet_addr(132.241.5.10);bzero(&(my_addr.sin_zero),8);注意:sin_addr.s_addr填本机IP,如果此项填INADDR_ANY时,表示自动取本机IP填入该项(仅用于Server)函数简介:socketSocket描述符与Linux中的文件描述符类似,也是一个int型的变量函数调用:intsocket(intdomain,inttype,intprotocol);函数返回Socket描述符,返回-1表示出错domain参数只能取AF_INET,protocol参数一般取0应用示例:TCP:sockfd=socket(AF_INET,SOCK_STREAM,0);UDP:sockfd=socket(AF_INET,SOCK_DGRAM,0);函数简介:bind作为Server程序,需要与一个端口绑定intbind(intsockfd,structsockaddr*my_addr,intaddrlen);bind函数返回-1表示出错,最常见的错误是该端口已经被其他程序绑定。需要注意的一点:在Linux系统中,1024以下的端口只有拥有root权限的程序才能绑定函数简介:connect连接某个Serverintconnect(intsockfd,structsockaddr*servaddr,intaddrlen);servaddr是事先填写好的结构,Server的IP和端口都在该数据结构中指定。函数简介:listen开始监听已经绑定的端口需要在此前调用bind()函数,否则由系统指定一个随机的端口intlisten(intsockfd,intqueue_length);接收队列一个新的Client的连接请求先被放在接收队列中,等待Server程序调用accept函数接受连接请求queue_length指的就是接收队列的长度也就是在Server程序调用accept函数之前最大允许的连接请求数,多余的连接请求将被拒绝函数简介:acceptaccept()函数将响应连接请求,建立连接产生一个新的socket描述符来描述该连接这个连接用来与特定的Client交换信息intaccept(intsockfd,structsockaddr*addr,int*addrlen);addr将在函数调用后被填入连接对方的地址信息,如对方的IP、端口等。accept缺省是阻塞函数,阻塞直到有连接请求accept()函数应用示例structsockaddr_intheir_addr;/*用于存储连接对方的地址信息*/intsin_size=sizeof(structsockaddr_in);……(依次调用socket(),bind(),listen()等函数)new_fd=accept(sockfd,&their_addr,&sin_size);printf(”对方地址:%s\n,inet_ntoa(their_addr.sin_addr));……函数简介:select应用于多路同步I/O模式intselect(intnumfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);numfds是要多路选择的socket的最大值其中readfds,writefds,exceptfds都是socket集合,分别代表有数据可读、有数据要写、发生异常的socket集合。timeout是select的时间限制返回值:在socket集合中准备好的socket个数socket集合集合变量类型:fd_set集合变量运算宏:FD_ZERO(*set)清空socket集合FD_SET(s,*set)将s加入socket集合FD_CLR(s,*set)从socket集合去掉sFD_ISSET(s,*set)判断s是否在socket集合中常数FD_SETSIZE:集合元素的最多个数Select应用举例fd_setrset;/*可读的socket集合*/FD_ZERO(&rset);/*清空rset集合*/FD_SET(sockfd,rset);/*将sockfd加入rset集合*/nready=select(maxfd+1,&rset,null,null,null);/*maxfd是已知的最大的socket*/if(FD_ISSET(sockfd,&rset)){……}函数简介:recv用于TCP协议中接收信息intrecv(intsockfd,void*buf,intlen,intflags);buf,指向容纳接收信息的缓冲区的指针len,缓冲区的大小flags,接收标志函数返回实际接收的字节数,返回-1表示出错recv缺省是阻塞函数,直到接收到信息或出错函数简介:recvfrom用于UDP协议中接收信息intrecvfrom(intsockfd,void*buf,intlen,unsignedintflagsstructsockaddr*from,int*fromlen);buf,指向容纳接收信息的缓冲区的指针len,缓冲区的大小flags,接收标志from,指明接收数据的来源函数返回实际接收的字节数,返回-1表示出错recvfrom是阻塞函数,直到接收到信息或出错函数简介:send用于TCP协议中发送信息intsend(intsockfd,constvoid*msg,intlen,intflags);msg,指向待发送信息的指针len,待发送的字节数flags,发送标志函数返回已发送的字节数,返回-1表示出错send缺省是阻塞函数,直到发送完毕或出错注意:如果函数返回值与参数len不相等,则剩余的未发送信息需要再次发送函数简介:sendto用于UDP协议中发送信息intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);buf,指向容纳接收信息的缓冲区的指针len,缓冲区的大小flags,接收标志to,指明发送数据的目的地函数返回已发送的字节数,返回-1表示出错sendto缺省是阻塞函数

1 / 83
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功