LINUXC编程网络编程.ppt

上传人:豆**** 文档编号:24405402 上传时间:2022-07-04 格式:PPT 页数:26 大小:471.50KB
返回 下载 相关 举报
LINUXC编程网络编程.ppt_第1页
第1页 / 共26页
LINUXC编程网络编程.ppt_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《LINUXC编程网络编程.ppt》由会员分享,可在线阅读,更多相关《LINUXC编程网络编程.ppt(26页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、LINUX C编程网络编程 Four short words sum up what has lifted most successful Four short words sum up what has lifted most successful individuals above the crowd: a little bit more. individuals above the crowd: a little bit more. -author -author -date-date套接字与网络编程套接字与网络编程TCP/IP协议简介协议简介Socket编程编程专门用专门用于为用于为用

2、户提供户提供应用服应用服务务(ftp,telnet,Smtp.)?TCP/IP参考模型参考模型应用层应用层传输层传输层互联网层互联网层网络接口层网络接口层管理连接中端到端通信的协议层,管理连接中端到端通信的协议层,定义了定义了TCP(传输控制协议传输控制协议),UDP(用户数据报协议用户数据报协议),并提出了,并提出了port的概念。的概念。主要实现将上层传下来的数据包封装主要实现将上层传下来的数据包封装成底层物理网络支持的数据格式,并成底层物理网络支持的数据格式,并转化成真正的电气信号在物理网络上转化成真正的电气信号在物理网络上传输。传输。最重要的概念最重要的概念IP协议,即对协议,即对IP

3、地址进行了分组。地址进行了分组。网络协议中一些术语网络协议中一些术语面向连接面向连接(Connection-oriented)的协议有两个端点,在通的协议有两个端点,在通信之前必须建立连接。信之前必须建立连接。协议提供了顺序性协议提供了顺序性(sequencing),保证数据按照发送的顺序保证数据按照发送的顺序到达目的地。到达目的地。协议提供了错误控制协议提供了错误控制(error?control),可以自动丢弃损坏的可以自动丢弃损坏的消息,然后安排重新发送数据。消息,然后安排重新发送数据。流流(stream)协议仅仅识别字节边界,也就是说一个字节的协议仅仅识别字节边界,也就是说一个字节的序列

4、可以被分割成片,然后发送出去,但是接收到的数据序列可以被分割成片,然后发送出去,但是接收到的数据仍然是原数据。仍然是原数据。基于包基于包(Packet-based)协议处理数据包,保持包边界向接协议处理数据包,保持包边界向接收者发送整个包。收者发送整个包。UDP(数据报协议数据报协议datagram)协议是基于包协议,协议是基于包协议,TCP协议是基于流协议协议是基于流协议的,不仅提供顺序性,而且提供了错误控制。的,不仅提供顺序性,而且提供了错误控制。Linux中的中的TCP/IP网络结构网络结构用户进程用户进程套接字接口套接字接口网络协议网络协议网络设备网络设备是进程与是进程与网络协议网络协

5、议之间的接之间的接口中。在口中。在Linux中中socket属属于文件系于文件系统的一部统的一部分,网络分,网络通信可以通信可以看成对文看成对文件的读取。件的读取。在一个在一个通信连通信连接中的接中的两端通两端通信程序信程序各自有各自有一个套一个套接字来接字来描述自描述自己那一己那一端。端。Socket?编程编程套接字与文件描述字套接字与文件描述字相同点:相同点:?像文件描述字一样,套接字像文件描述字一样,套接字也使用也使用read,write来读写数据。来读写数据。不同点:不同点:?套接字除了有一个地址以外,套接字除了有一个地址以外,还包含还包含3个属性个属性域、类型和协域、类型和协议。议。

6、Socket编程相关的数据结构编程相关的数据结构1Struct?sockaddr:保存着套接字的地址信息保存着套接字的地址信息Struct?sockaddrUnsigned?short?sa_family;/地址族地址族Char?sa_data14;/套接字实际的地址数据套接字实际的地址数据(目的地址及端口目的地址及端口)?每种协议都有自己的网络地址的定义,套接字每种协议都有自己的网络地址的定义,套接字API必须对这些不必须对这些不同的地址定义进行抽象。同的地址定义进行抽象。Socket?编程编程Socket编程相关的数据结构编程相关的数据结构1协议和地址族协议和地址族 Internet通信域

7、套接字地址结构通信域套接字地址结构sockaddr_instruct?sockaddr_inshort?int?sin_family;?/地址族地址族unsigned?short?int?sin_port;?/端口号端口号struct?in_addr?sin_addr;?/IP地址地址char?sin_zero8;?/填充填充0以保持与以保持与struct?sockaddr同样大小同样大小,这样一个指向这样一个指向sockaddr_in数据结构的指针数据结构的指针可以强行转换为一个指向数据结构可以强行转换为一个指向数据结构sockaddr的指针。的指针。?/端口号以及端口号以及?Interne

8、t?地址使用的是网络字节顺序,需地址使用的是网络字节顺序,需要通过特殊函数进行转换要通过特殊函数进行转换?Socket?编程编程Socket编程相关的数据结构编程相关的数据结构2Socket?编程编程网络字节顺序网络字节顺序TCP/IP网络通常是异构的,它包含大量不同种类的计算机及体系结构。网络通常是异构的,它包含大量不同种类的计算机及体系结构。在体系结构上最大的区别就是存储数据的方式。在体系结构上最大的区别就是存储数据的方式。常见的方式有两种,大尾端常见的方式有两种,大尾端(把最高位的字节存放在最低的硬件地址上把最高位的字节存放在最低的硬件地址上)和小尾端和小尾端(反之反之)。TCP/IP协

9、议使用大尾端,而所有的协议使用大尾端,而所有的intel和和intel兼容的处理器都采用小兼容的处理器都采用小尾端字节存储顺序。因此在网络上传输多字节数据的顺序被称为网络字尾端字节存储顺序。因此在网络上传输多字节数据的顺序被称为网络字节顺序。节顺序。几个字节顺序转换函数:几个字节顺序转换函数:Htons:”Host?To?Network?Short”,主机地址主机地址-网络字节顺序网络字节顺序Htonl:”?Host?To?Network?Long”,主机地址主机地址-网络字节顺序网络字节顺序(长型长型),此长型非,此长型非C语言中的语言中的long,详见函数原型详见函数原型。ntohs:”?

10、Network To Host?Short”,网络字节顺序网络字节顺序-主机地址主机地址ntohl:”?Network To Host?long”,网络字节顺序网络字节顺序-主机地址主机地址(长型长型)?获取服务器和客户端主机信息获取服务器和客户端主机信息#include?Struct?hostent?*?gethostbyname(const?char?*?hostname);/将机器名将机器名()转换为一个转换为一个hostent的结构指针,在这个结构里的结构指针,在这个结构里保存域名的地址信息。保存域名的地址信息。Struct?hostent?*?gethostbyaddr(const?

11、char?*?addr,int?len,int?type);将一个将一个32位的位的IP地址地址(C0A80001)转换为一个转换为一个hostent的结构指针,的结构指针,在这个结构里保存域名的地址信息。在这个结构里保存域名的地址信息。Ip地址和域名的转换地址和域名的转换Struct?hostentchar?*?h_name;/主机的正式名字主机的正式名字(域名域名)?char?*?h_aliases;/主机的别名主机的别名int?h_addrtype;/主机的地址类型主机的地址类型(如如AF_INET)?int?h_lengh;/主机的地址长度,对于主机的地址长度,对于IPV4为说是为说是

12、4个字节其个字节其32位位char?*?h_addr_list;/主机的主机的IP地址列表地址列表#define?h_addr?h_addr_list0/主机的第一个主机的第一个IP地址地址获取服务器和客户端主机信息获取服务器和客户端主机信息#include?#include?Int?inet_aton(const?char?*?cp,struct?in_addr?*inp)?char?*?inet_ntoa(struct?in_addr?in)?/网络上的网络上的IP地址都是由地址都是由“点分十进制点分十进制”(“192.168.1.0”)方式表示方式表示,在在struct?in_addr结

13、构中采用的是结构中采用的是32位的位的IP地址,地址,“192.168.1.0”实际实际表示为表示为32位的位的IP地址应该为地址应该为C0A80100。a代表代表”ascii”,n代表代表”network”。Inet_aton()将将a.b.c.d的的IP转换为转换为32位的位的IP地址,并存储在地址,并存储在inp指针所指针所指向的地址里;指向的地址里;Inet_ntoa()将将32位的位的IP地址转换为地址转换为”a.b.c.d”的字符串格式。的字符串格式。字符串的字符串的IP地址与地址与32位的位的IP地址的转换地址的转换获取服务器和客户端主机信息获取服务器和客户端主机信息字符串的字符

14、串的IP地址与地址与32位的位的IP地址的转换地址的转换获取服务器和客户端主机信息获取服务器和客户端主机信息#include?struct hostent * gethostbyname(const char * hostname);域名-IP转换struct hostent * gethostbyaddr(const char * hostname);IP域名转换获取主机信息的函数获取主机信息的函数Socket?编程编程基于基于TCP即面向连接的通信数据流 #include? #include? int?socket(int?domain,int?type,int?protocol)? 函数

15、说明:创建一个套接字描述符,如果失败返函数说明:创建一个套接字描述符,如果失败返回回?-1. domain为地址族为地址族AF_XXX,type为套接字类型,为套接字类型,SOCK_STREAM(TCP),SOCK_DGRAM?(UDP),SOCK_RAW(IP、ICMP);); protocol?指定协议指定协议?0为自动选择为自动选择?。(第一步第一步)创建套接字以获创建套接字以获得文件描述符得文件描述符Socket?编程编程(采用客户端采用客户端/服务器端模工作服务器端模工作)? #include? #include? int?bind(int?sockfd,struct?sockadd

16、r*?my_addr,int?addrlen); 函数说明:成功返回函数说明:成功返回0,如果失败返回,如果失败返回?-1 sockfd:由由socket()调用返回的文件描述符调用返回的文件描述符 myaddr:?指向指向sockaddr的指针,由于系统兼容性问题,一的指针,由于系统兼容性问题,一般般 使用使用struct?sockaddr_in代替。代替。 addrlen:sockaddr结构的长度结构的长度Socket?编程步骤编程步骤(第二步第二步)建立连接,建立连接,将套接字与本将套接字与本地计算机的地址绑定在一起地计算机的地址绑定在一起Socket?编程编程#include?#in

17、clude?#include?#define?MYPORT?3333/最好选择最好选择1024以后的端口以后的端口Main()Int?sockfd;Struct?sockaddr_in?my_addr;/通常情况下使用通常情况下使用sockaddr_in结构结构Sockfd=socket(AF_INET,SOCKET_STREAM,0);my_addr.sin_family=AF_INET;my_addr.sin_port=htons(MYPORT);/或者设置为零也可,内核会自动分配一个或者设置为零也可,内核会自动分配一个未使用的端口未使用的端口My_addr.sin_addr.s_addr

18、=inet_addr(“192.168.1.125”);/写法二写法二My_addr.sin_addr.s_addr=htonl(INADDR_ANY);非指定地址被包含在非指定地址被包含在常量常量INADDR_ANY中中Bzero(&(my_addr.sin_zero),8);Bind(sockfd,(struct?sockaddr*)&my_addr,sizeof(struct?sockaddr);.将套接字与本地计算机的某个端口绑定在一起将套接字与本地计算机的某个端口绑定在一起(示范如何使用示范如何使用bind)?int opt = 1; setsockopt(listenfd, SOL

19、_SOCKET,SO_REUSEADDR, &opt,sizeof(opt); 在套接字被绑定到地址后,进程通过调用在套接字被绑定到地址后,进程通过调用listen(),来告诉系统它愿来告诉系统它愿意让其它进程与该套接字建立连接。意让其它进程与该套接字建立连接。 int?listen(int?sockfd,int?backlog);sockfd:bind()后的文件描述符。后的文件描述符。 Backlog:等待联机队列的大小,等待中而未被等待联机队列的大小,等待中而未被accept()的联机请求被放在队列,当队列满了的联机请求被放在队列,当队列满了就无法再接受联机请求,就无法再接受联机请求,c

20、lient会收到会收到connection?refused的错误。的错误。 执行成功返回执行成功返回0,失败为,失败为1。Socket?编程步骤编程步骤(第三步第三步)等待等待client联机请求联机请求 int?accept(int?sockfd,struct?sockaddr?*addr,int?*addrlen)? Sockfd:是是listen后的文件描述符后的文件描述符 Addr:将被将被client的的ip?address填充填充 Addrlen:将被将被client的的ip?address的长度填充的长度填充 成功则返回成功则返回client的的socket?文件描述符,之后文件

21、描述符,之后的数据传输就可以使用新的的数据传输就可以使用新的文件描述符。文件描述符。Socket?编程步骤编程步骤(第四步第四步)接受接受client联机请求联机请求连接并不是立即建立进来的,必须通过连接并不是立即建立进来的,必须通过accept()系统调用接收连系统调用接收连接接请求,新的试图连接到已监听地址的连接请求称为未决的连接,请求,新的试图连接到已监听地址的连接请求称为未决的连接,这个连接一直等待直到被这个连接一直等待直到被accept()为止。为止。Socket?编程编程客户端步骤客户端步骤 int?connect(?int?sockfd,struct?sockaddr?*serv

22、_addr,?int?addrlen);sockfd:socket返回的文件描述符返回的文件描述符 serv_addr:指向指向struct?sockaddr的指针,保的指针,保存服务器端的连接信息存服务器端的连接信息 Addren:可以用可以用sizeof(struct?sockaddr)设置设置 成功返回成功返回0,出错则返回出错则返回-1第一步与第一步与server端程序相同,第二步可直接使用端程序相同,第二步可直接使用connect与服务器连接与服务器连接用于用于建立连接后建立连接后完成发送与接收数据的系统调用完成发送与接收数据的系统调用(数据流套接字数据流套接字)?Send()和和r

23、ecv()函数函数#include?int?send(int?sockfd,const?void?*msg,int?len,int?flags)?Sockfd:希望进行数据传递的套接字的文件描述符希望进行数据传递的套接字的文件描述符Msg:指向发送数据的指针指向发送数据的指针Len:希望发送的数据的字节长度:希望发送的数据的字节长度Flags:通常设置为通常设置为0成开则返回实际发送字节的长度,出错则返回成开则返回实际发送字节的长度,出错则返回-1int?recv(int?sockfd,void?*?buf,int?len,unsigned?int?flags)?Buf:保存读入信息的地址保存

24、读入信息的地址Len:表示接收表示接收buf的最大长度的最大长度可以使用可以使用close(int?sockfd)和和shutdown(int?sock,int?how)来关闭来关闭连接的套接字文件描述符连接的套接字文件描述符Shutdown中的中的how参数含义如下:参数含义如下:0:代表断开远程接收代表断开远程接收1:代表断开远程发送代表断开远程发送2:代表断开远程接收和发送代表断开远程接收和发送listenfd?=?socket(.);?bind(listenfd,?.);?listen(listenfd,?.);?while?(1)?connfd?=?accept(listenfd,?

25、.);?n?=?fork();?if?(n?=?-1)?perror(call?to?fork);?exit(1);?else?if?(n?=?0)?close(listenfd);?while?(1)?read(connfd,?.);write(connfd,?.);?close(connfd);?exit(0);?else?close(connfd);?使用使用fork并发处理多个并发处理多个client的请求的请求基于基于UDP的的c/s模式模式用于用于无连接无连接发送与接收数据的系统调用发送与接收数据的系统调用(用于数据报套接字用于数据报套接字)?Sendto()和和recvfrom(

26、)函数函数#include?int?sendto(int?sockfd,const?void?*msg,int?len,unsigned?int?flags,Const?struct?sockaddr?*?to,int?tolen)?除最后两个参数之外,其它参数与除最后两个参数之外,其它参数与send()相同,相同,to指向包含目的指向包含目的IP地址和端口号的数据结构地址和端口号的数据结构sockaddr的指针,的指针,tolen可以设置为可以设置为Sizeof(struct?sockaddr)?int?recvfrom(int?sockfd,void?*?buf,int?len,unsigned?int?flags,Struct?sockaddr?*?from,int?*fromlen)?From:指向本地计算机中包含源指向本地计算机中包含源IP地址和端口号的数据结构地址和端口号的数据结构Sockaddr的指针,的指针,fromlen可以设置为可以设置为sizeof(struct?sockaddr),如果对源地址不感兴趣,可以设置为如果对源地址不感兴趣,可以设置为NULL。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com