LINUXC编程网络.ppt

上传人:小飞机 文档编号:5437901 上传时间:2023-07-07 格式:PPT 页数:26 大小:261.50KB
返回 下载 相关 举报
LINUXC编程网络.ppt_第1页
第1页 / 共26页
LINUXC编程网络.ppt_第2页
第2页 / 共26页
LINUXC编程网络.ppt_第3页
第3页 / 共26页
LINUXC编程网络.ppt_第4页
第4页 / 共26页
LINUXC编程网络.ppt_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《LINUXC编程网络.ppt》由会员分享,可在线阅读,更多相关《LINUXC编程网络.ppt(26页珍藏版)》请在三一办公上搜索。

1、LINUX C编程,套接字与网络编程,TCP/IP协议简介Socket编程,专门用于为用户提供应用服务(ftp,telnet,Smtp.),TCP/IP参考模型,应用层,传输层,互联网层,网络接口层,管理连接中端到端通信的协议层,定义了TCP(传输控制协议),UDP(用户数据报协议),并提出了port的概念。,主要实现将上层传下来的数据包封装成底层物理网络支持的数据格式,并转化成真正的电气信号在物理网络上传输。,最重要的概念IP协议,即对IP地址进行了分组。,网络协议中一些术语,面向连接(Connection-oriented)的协议有两个端点,在通信之前必须建立连接。协议提供了顺序性(seq

2、uencing),保证数据按照发送的顺序到达目的地。协议提供了错误控制(error control),可以自动丢弃损坏的消息,然后安排重新发送数据。流(stream)协议仅仅识别字节边界,也就是说一个字节的序列可以被分割成片,然后发送出去,但是接收到的数据仍然是原数据。基于包(Packet-based)协议处理数据包,保持包边界向接收者发送整个包。,UDP(数据报协议datagram)协议是基于包协议,TCP协议是基于流协议的,不仅提供顺序性,而且提供了错误控制。,Linux中的TCP/IP网络结构,用户进程,套接字接口,网络协议,网络设备,是进程与网络协议之间的接口中。在Linux中sock

3、et属于文件系统的一部分,网络通信可以看成对文件的读取。,在一个通信连接中的两端通信程序各自有一个套接字来描述自己那一端。,Socket 编程,套接字与文件描述字相同点:像文件描述字一样,套接字也使用read,write来读写数据。不同点:套接字除了有一个地址以外,还包含3个属性域、类型和协议。,Socket编程相关的数据结构1,Struct sockaddr:保存着套接字的地址信息Struct sockaddrUnsigned short sa_family;/地址族Char sa_data14;/套接字实际的地址数据(目的地址及端口),每种协议都有自己的网络地址的定义,套接字API必须对这

4、些不同的地址定义进行抽象。,Socket 编程,Socket编程相关的数据结构1,协议和地址族,Internet通信域套接字地址结构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的指针。/端口号以及 Internet 地址使用的是网络字

5、节顺序,需要通过特殊函数进行转换,Socket 编程,Socket编程相关的数据结构2,Socket 编程,网络字节顺序,TCP/IP网络通常是异构的,它包含大量不同种类的计算机及体系结构。在体系结构上最大的区别就是存储数据的方式。常见的方式有两种,大尾端(把最高位的字节存放在最低的硬件地址上)和小尾端(反之)。TCP/IP协议使用大尾端,而所有的intel和intel兼容的处理器都采用小尾端字节存储顺序。因此在网络上传输多字节数据的顺序被称为网络字节顺序。,几个字节顺序转换函数:Htons:”Host To Network Short”,主机地址-网络字节顺序Htonl:”Host To N

6、etwork Long”,主机地址-网络字节顺序(长型),此长型非C语言中的long,详见函数原型。ntohs:”Network To Host Short”,网络字节顺序-主机地址ntohl:”Network To Host long”,网络字节顺序-主机地址(长型),获取服务器和客户端主机信息,#include Struct hostent*gethostbyname(const char*hostname);/将机器名()转换为一个hostent的结构指针,在这个结构里保存域名的地址信息。Struct hostent*gethostbyaddr(const char*addr,int l

7、en,int type);将一个32位的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;/主机的IP地址列表#define h_addr h_addr_list0/主机的第一个IP地址,获取服务器和客户端主机信息,#include#i

8、nclude 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”实际表示为32位的IP地址应该为C0A80100。a代表”ascii”,n代表”network”。Inet_aton()将的IP转换为32位的IP地址,并存储在inp指针所指向的地址里;Inet_ntoa()将32位的IP地址转换为”a.b.c.d”的字符串格

9、式。,字符串的IP地址与32位的IP地址的转换,获取服务器和客户端主机信息,字符串的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)函数说明:

10、创建一个套接字描述符,如果失败返回-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 sockaddr*my_addr,int addrlen);函数说明:成功返回0,如果失败返回-1sockfd:由socket()调用返回的文件描述符myaddr:指向sockadd

11、r的指针,由于系统兼容性问题,一般使用struct sockaddr_in代替。addrlen:sockaddr结构的长度,Socket 编程步骤,(第二步)建立连接,将套接字与本地计算机的地址绑定在一起,Socket 编程,#include#include#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

12、;my_addr.sin_port=htons(MYPORT);/或者设置为零也可,内核会自动分配一个未使用的端口My_addr.sin_addr.s_addr=inet_addr(“192.168.1.125”);/写法二My_addr.sin_addr.s_addr=htonl(INADDR_ANY);非指定地址被包含在常量INADDR_ANY中Bzero(.,将套接字与本地计算机的某个端口绑定在一起(示范如何使用bind),int opt=1;setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,在套接字被绑定到地址后,进程通过调用listen(),来告

13、诉系统它愿意让其它进程与该套接字建立连接。,int listen(int sockfd,int backlog);sockfd:bind()后的文件描述符。Backlog:等待联机队列的大小,等待中而未被accept()的联机请求被放在队列,当队列满了就无法再接受联机请求,client会收到connection refused的错误。执行成功返回0,失败为1。,Socket 编程步骤,(第三步)等待client联机请求,int accept(int sockfd,struct sockaddr*addr,int*addrlen)Sockfd:是listen后的文件描述符Addr:将被clien

14、t的ip address填充Addrlen:将被client的ip address的长度填充成功则返回client的socket 文件描述符,之后的数据传输就可以使用新的文件描述符。,Socket 编程步骤,(第四步)接受client联机请求,连接并不是立即建立进来的,必须通过accept()系统调用接收连接请求,新的试图连接到已监听地址的连接请求称为未决的连接,这个连接一直等待直到被accept()为止。,Socket 编程,客户端步骤,int connect(int sockfd,struct sockaddr*serv_addr,int addrlen);sockfd:socket返回的

15、文件描述符serv_addr:指向struct sockaddr的指针,保存服务器端的连接信息Addren:可以用sizeof(struct sockaddr)设置成功返回0,出错则返回-1,第一步与server端程序相同,第二步可直接使用connect与服务器连接,用于建立连接后完成发送与接收数据的系统调用(数据流套接字),Send()和recv()函数,#include int send(int sockfd,const void*msg,int len,int flags)Sockfd:希望进行数据传递的套接字的文件描述符Msg:指向发送数据的指针Len:希望发送的数据的字节长度Flag

16、s:通常设置为0成开则返回实际发送字节的长度,出错则返回-1,int recv(int sockfd,void*buf,int len,unsigned int flags)Buf:保存读入信息的地址Len:表示接收buf的最大长度,可以使用close(int sockfd)和shutdown(int sock,int how)来关闭连接的套接字文件描述符,Shutdown中的how参数含义如下:0:代表断开远程接收1:代表断开远程发送2:代表断开远程接收和发送,listenfd=socket(.);bind(listenfd,.);listen(listenfd,.);while(1)con

17、nfd=accept(listenfd,.);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()函数,#include int sendto(int sockfd,const v

18、oid*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。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号