LINUXC编程网络编程

上传人:桔**** 文档编号:591527868 上传时间:2024-09-18 格式:PPT 页数:26 大小:470KB
返回 下载 相关 举报
LINUXC编程网络编程_第1页
第1页 / 共26页
LINUXC编程网络编程_第2页
第2页 / 共26页
LINUXC编程网络编程_第3页
第3页 / 共26页
LINUXC编程网络编程_第4页
第4页 / 共26页
LINUXC编程网络编程_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《LINUXC编程网络编程》由会员分享,可在线阅读,更多相关《LINUXC编程网络编程(26页珍藏版)》请在金锄头文库上搜索。

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

2、正的电气信号在物理网络上传输。传输。最重要的概念最重要的概念IP协议,即对协议,即对IP地址进行了分组。地址进行了分组。网络协议中一些术语网络协议中一些术语面向连接面向连接(Connection-oriented)的协议有两个端点,在通的协议有两个端点,在通信之前必须建立连接。信之前必须建立连接。协议提供了顺序性协议提供了顺序性(sequencing),保证数据按照发送的顺序保证数据按照发送的顺序到达目的地。到达目的地。协议提供了错误控制协议提供了错误控制(error control),可以自动丢弃损坏的可以自动丢弃损坏的消息,然后安排重新发送数据。消息,然后安排重新发送数据。流流(strea

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

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

5、外,套接字除了有一个地址以外,还包含还包含3个属性个属性域、类型和协域、类型和协议。议。Socket编程相关的数据结构编程相关的数据结构1Struct sockaddr:保存着套接字的地址信息保存着套接字的地址信息Struct sockaddrUnsigned short sa_family;/地址族地址族Char sa_data14;/套接字实际的地址数据套接字实际的地址数据(目的地址及端口目的地址及端口)每种协议都有自己的网络地址的定义,套接字每种协议都有自己的网络地址的定义,套接字API必须对这些不必须对这些不同的地址定义进行抽象。同的地址定义进行抽象。Socket 编程编程Socket

6、编程相关的数据结构编程相关的数据结构1协议和地址族协议和地址族业余无线电使用业余无线电使用NetRomPF_NETROMAF_NETROMAppleTalk DDSPF_APPLETALKAF_APPLETAlKNovell的的IPXPF_IPXAF_IPX业余无线电使用业余无线电使用AX.25PF_AX25AF_AX25TCP/IP(ipv6)PF_INET6AF_INET6TCP/IP(ipv4)PF_INETAF_INETUnix域域PF_UNIXAF_UNIX协议描述协议描述协议协议地址地址Internet通信域套接字地址结构通信域套接字地址结构sockaddr_instruct so

7、ckaddr_inshort int sin_family; /地址族地址族unsigned short int sin_port; /端口号端口号struct in_addr sin_addr; /IP地址地址char sin_zero8; /填充填充0以保持与以保持与struct sockaddr同样大小同样大小,这样一个指向这样一个指向sockaddr_in数据结构的指针数据结构的指针可以强行转换为一个指向数据结构可以强行转换为一个指向数据结构sockaddr的指针。的指针。 /端口号以及端口号以及 Internet 地址使用的是网络字节顺序,需地址使用的是网络字节顺序,需要通过特殊函数

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

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

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

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

12、P地址列表地址列表#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结构中采用的是结构中采用的是32位的位的IP地址,地址,“192.168.1.0”实际

13、实际表示为表示为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地址的转换地址的转换获取服务器和客户端主机信息获取服务器和客户端主机信息字符串的字符串的IP地址与地址与32位的位的IP地址的转换地址的转换获取服务器和客户端主机信息获

14、取服务器和客户端主机信息#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)函数说明:创建一个套接字描述符,如果失败返函数说明:创建一个套接字描述符,如果失败返回回 -1.d

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

16、失败返回 -1sockfd:由由socket()调用返回的文件描述符调用返回的文件描述符myaddr: 指向指向sockaddr的指针,由于系统兼容性问题,一的指针,由于系统兼容性问题,一般般使用使用struct sockaddr_in代替。代替。addrlen:sockaddr结构的长度结构的长度Socket 编程步骤编程步骤(第二步第二步)建立连接,建立连接,将套接字与本将套接字与本地计算机的地址绑定在一起地计算机的地址绑定在一起Socket 编程编程#include #include #include #define MYPORT 3333/最好选择最好选择1024以后的端口以后的端口M

17、ain()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=inet_addr(“192.168.1.125”);/写法二写法二My_addr.sin_addr.s_addr

18、=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_SOCKET,SO_REUSEADDR, &opt,sizeof(opt); 在套接字被绑定到地址后,进程通过调用在

19、套接字被绑定到地址后,进程通过调用listen(),来告诉系统它愿来告诉系统它愿意让其它进程与该套接字建立连接。意让其它进程与该套接字建立连接。int listen(int sockfd,int backlog);sockfd:bind()后的文件描述符。后的文件描述符。Backlog:等待联机队列的大小,等待中而未被等待联机队列的大小,等待中而未被accept()的联机请求被放在队列,当队列满了就无法再的联机请求被放在队列,当队列满了就无法再接受联机请求,接受联机请求,client会收到会收到connection refused的错误。的错误。执行成功返回执行成功返回0,失败为,失败为1。S

20、ocket 编程步骤编程步骤(第三步第三步)等待等待client联机请求联机请求int accept(int sockfd,struct sockaddr *addr,int *addrlen)Sockfd:是是listen后的文件描述符后的文件描述符Addr:将被将被client的的ip address填充填充Addrlen:将被将被client的的ip address的长度填充的长度填充成功则返回成功则返回client的的socket 文件描述符,之后文件描述符,之后的数据传输就可以使用新的的数据传输就可以使用新的文件描述符。文件描述符。Socket 编程步骤编程步骤(第四步第四步)接受接

21、受client联机请求联机请求连接并不是立即建立进来的,必须通过连接并不是立即建立进来的,必须通过accept()系统调用接收连系统调用接收连接接请求,新的试图连接到已监听地址的连接请求称为未决的连接,请求,新的试图连接到已监听地址的连接请求称为未决的连接,这个连接一直等待直到被这个连接一直等待直到被accept()为止。为止。Socket 编程编程客户端步骤客户端步骤int connect( int sockfd,struct sockaddr *serv_addr, int addrlen);sockfd:socket返回的文件描述符返回的文件描述符serv_addr:指向指向struct

22、 sockaddr的指针,保的指针,保存服务器端的连接信息存服务器端的连接信息Addren:可以用可以用sizeof(struct sockaddr)设置设置成功返回成功返回0,出错则返回出错则返回-1第一步与第一步与server端程序相同,第二步可直接使用端程序相同,第二步可直接使用connect与服务器连接与服务器连接用于用于建立连接后建立连接后完成发送与接收数据的系统调用完成发送与接收数据的系统调用(数据流套接字数据流套接字)Send()和和recv()函数函数#include int send(int sockfd,const void *msg,int len,int flags)S

23、ockfd:希望进行数据传递的套接字的文件描述符希望进行数据传递的套接字的文件描述符Msg:指向发送数据的指针指向发送数据的指针Len:希望发送的数据的字节长度:希望发送的数据的字节长度Flags:通常设置为通常设置为0成开则返回实际发送字节的长度,出错则返回成开则返回实际发送字节的长度,出错则返回-1int recv(int sockfd,void * buf,int len,unsigned int flags)Buf:保存读入信息的地址保存读入信息的地址Len:表示接收表示接收buf的最大长度的最大长度可以使用可以使用close(int sockfd)和和shutdown(int soc

24、k,int how)来关闭来关闭连接的套接字文件描述符连接的套接字文件描述符Shutdown中的中的how参数含义如下:参数含义如下:0:代表断开远程接收代表断开远程接收1:代表断开远程发送代表断开远程发送2:代表断开远程接收和发送代表断开远程接收和发送listenfd = socket(.); bind(listenfd, .); listen(listenfd, .); while (1) connfd = accept(listenfd, .); n = fork(); if (n = -1) perror(call to fork); exit(1); else if (n = 0)

25、close(listenfd); while (1) read(connfd, .);write(connfd, .); close(connfd); exit(0); else close(connfd); 使用使用fork并发处理多个并发处理多个client的请求的请求基于基于UDP的的c/s模式模式用于用于无连接无连接发送与接收数据的系统调用发送与接收数据的系统调用(用于数据报套接字用于数据报套接字)Sendto()和和recvfrom()函数函数#include int sendto(int sockfd,const void *msg,int len,unsigned int fla

26、gs,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。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号