您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > Linux网络编程笔记(修订版)
Linux网络编程笔记(修订版)收藏新一篇:C++中的内存错误与泄漏|旧一篇:Linux下C++程序调试及除错方法我的网络编程笔记,因为最近又要做Linux下的网络编程,故重新修订,其中一些内容参考了文末的链接及文章1......................................................................................................基本概念12......................................................................................................基本接口22.1..................................................................................打开一个socket42.2...........................................................将socket绑定定指定的端口—bind42.3...............................................................侦听socket—listen(服务器端)42.4............................................................等待接收请求—accept(服务器端)42.5.......................................................................连接到socket—connect52.6............................................................................利用socket传输数据52.6.1...................................................................................read和write52.6.2...................................................................................recv和send52.6.3..........................................................................recvfrom和sendto62.6.4........................................................................recvmsg和sendmsg62.7................................................................套接字的关闭close/shutdown63.......................................................................................最常用的服务器模型.73.1...............................................................................................循环服务器:73.1.1............................................................................循环服务器之UDP服务器73.1.2............................................................................循环服务器之TCP服务器73.2................................................................................................并发服务器73.2.1............................................................................并发服务器之TCP服务器73.2.2...........................................................................并发服务器之多路复用I/O83.2.3............................................................................并发服务器之UDP服务器94......................................................................................................实例分析105..............................................................................................参考链接及文章121.基本概念说到网络编程,不得不先提到OSI参考模型,其七层模型从下到上分别为1.物理层(PhysicalLayer,PH)2.数据链路层(DataLinkLayer,DL)3.网络层(NetworkLayer,N)4.运输层(TransportLayer,T)5.会话层(SessionLayer,S)6.表示层(PresentationLayer,P)7.应用层(ApplicationLayer,A)现在最流行的网络协议无疑就是TCP/IP(TransmissionControlProtocol/InternetProtocol)协议.注:IP(InternetProtocol),网际协议;IP是TCP/IP的最底层,高层协议都要转化为IP包,IP包含了源地址和目的地址,路由决策也发生在IP层;ICMP(InternetControlMessageProtocol),网际报文协议;它包括了数据包的错误、控制等相关信息。比如ping命令就是利用ICMP来测试一个网络的连接情况的工具;TCP(TransmissionControlProtocol),传输控制协议。TCP运行在IP之上,是基于数据流连接和面向的协议,应用程序把数据要经过TCP/IP的分割成若干包,这样数据就以字节流发送和接收,到达目的地后,TCP/IP再按顺序进行组装。TCP/IP要保证机器与机器之间的连接的可靠性,还要有纠错。TCP是否被选择,取决于应用程序或服务;UDP(UserDatagramProtocol),用户数据报协议,象TCP一样运行在IP之上,是基于数据报或分组的协议,UDP/IP可以直接发送和接收数据报文,而不必做验证,这一点与TCP/IP不同。TCP是否被选择,取决于应用程序或服务;2.基本接口以Unix/Linux平台为例,系统会建立许多网络服务程序$netstat-aProtoRecv-QSend-QLocalAddressForeignAddressStatetcp00*:1975:LISTENudp00*:1978:tcp00MYServer:34320192.168.1.2:1521ESTABLISHED以上可以看到有三个网络连接,一个是TCP接连在1975端口侦听,一个UDP连接在1978端口,另外一个TCP连接是连接到DB的我们可以看出,客户端程序需要通过”主机名:端口号”与服务器建立连接.主机名其实就是IP地址.上面的MYServer其实是192.168.1.3,这样的主机名与IP的对应关系由本机的host文件或DNS服务器解析提供.$more/etc/hosts#thatrequirenetworkfunctionalitywillfail.127.0.0.1localhost.localdomainlocalhost192.168.1.3MYServer$more/etc/resolv.confnameserver192.168.1.1当然,我们在编程时无需查询这些文件或服务器,系统提供了API:gethostbyname/gethostbyaddr#includenetdb.hexterninth_errno;structhostent*gethostbyname(constchar*name);#includesys/socket.h/*forAF_INET*/structhostent*gethostbyaddr(constchar*addr,intlen,inttype);它们会返回一个指针,指向如下结构的对象structhostent{charh_name;/officialname*/char**h_aliases;/*aliaslist*/inth_addrtype;/*addresstype*/inth_length;/*addresslength*/char**h_addr_list;/*addresslist*/};#defineh_addrh_addr_list[0]/*backwardcompatibility*/h_addr_list是一个与域名对应的IP地址的列表,勤快的程序员会依次尝试连接列表中返回的IP地址懒惰的程序员只会用h_addr,h_addr_list列表中的第一个IP地址不同的应用程序使用不同的端口和协议,比如常用的ftp就用21端口和tcp协议$more/etc/services#service-nameport/protocol[aliases...][#comment]ftp21/tcpftp21/udpfspfspdssh22/tcp#SSHRemoteLoginProtocolssh22/udp#SSHRemoteLoginProtocoltelnet23/tcptelnet23/udp#24-privatemailsystemsmtp25/tcpmailsmtp25/udpmail...同样,程序中是无需查询这个文件的,Unix提供了getservbyname#includenetdb.hstructservent*getservbyname(constchar*name,constchar*proto);返回structservent{chars_name;/officialservicename*/char**s_aliases;/*aliaslist*/ints_port;/*portnumber*/chars_proto;/protocoltouse*/}知道主机名(IP)和端口号,我们就可以编写在这台主机的运行的或是连接到它的网络应用程序了Unix/Linux系统中是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用,会返回一个通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来操作,可以通过向描述符读写操作实现网络之间的数据交流.2.1.打开一个socketintsocket(intdomain,inttype,intprotocol)domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等).AF_UNIX只能够用于单一的Unix系统进程间通信,而AF_INET是针对Internet的,因而可以允许在远程主机之间通信(当我们mansocket时发现domain可选项是PF_*而不是
本文标题:Linux网络编程笔记(修订版)
链接地址:https://www.777doc.com/doc-4952140 .html