




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章 套接口概念,套接口简介 域和地址簇 地址转换函数 利用套接口通信,2.1 套接口简介(1),网间进程通信: 单机环境:不同进程用进程号(PID)唯一标识 网络环境:与协议、地址、端口有关 端口:进程通过系统调用与某端口建立连接后,传输层通过端口与进程通信。端口操作类似一般的I/O操作,可以用读写原语访问,端口号类似于文件描述符。不同协议(如TCP和UDP)可以有相同的端口号,不冲突。 地址:网络地址、主机地址、进程标识(端口号),一个完整的网间进程通信需要三元组(协议,本机地址,本机端口号)或五元组标识(协议,本机地址,本机端口号,远程主机,远程端口号) 网络字节顺序:不同计算机存放多字节值顺序不同,网络协议中需指定网络字节顺序。,2.1 套接口简介(2),Client/Server模式: 网间进程通信的主要模式是客户机/服务器模式。客户程序向服务程序发请求,服务程序接收来自客户程序的请求并处理,处理后把结果回送给客户,服务进程一般是先于客户请求启动的。这两个进程往往通过网络连接在不同机器上,进程间的通信使用网络编程。 Socket: 应用程序调用编程接口实现网络编程。Socket(套接字)可以在传输层、网际层和数据链路层上进行编程。,2.1 套接口简介(3),Socket的使用 插座的使用,Socket与插座的类比,2.1 套接口简介(4),Socket类型 Internet Socket(Internet地址) UNIX Socket (本地节点路径名) X.25 Socket(X.25地址) 只讲Internet Socket,常用类型有: 流套接字 SOCK_STREAM:基于TCP协议。 数据报套接字 SOCK_DGRAM :基于UDP协议。 原始套接字 SOCK_RAM :允许对较低层次协议(如IP、ICMP)直接访问。 本地套接字:通过socket技术可以实现不同主机上进程间通信,在单一主机上进程间的通信(IPC)也可用socket技术实现,用于移植远程客户/服务器程序到单一主机上。,2.1 套接口简介(5),使用Socket 使用文件描述符 文件描述符是一个和打开的文件相关联的整数,这个文件可以是真正的文件、网络连接、管道、终端等。 Socket使用UNIX文件描述符和其他进程通信系统调用。 需要一套专用的函数来操作 socket() 创建套接口,返回一个文件描述符 connect()、accept()等连接 send()、recv()、read()、write()等读写 close() 等关闭套接口,2.2 域和地址族(1),域 网络通信需要套接口地址标识自己 创建套接口时使用 int socket(int domain,int type,int protocol); AF_INET域使用的数据结构 (地址族) 通用套接口地址(只是模型) sockaddr Internet(IPv4)套接口地址(AF_INET域) sockaddr_in,取AF_INET,2.2 域和地址簇(2),Socket用到的数据结构(P23) #include (1)存储地址和端口信息的sockaddr struct sockaddr unsigned short sa_family; /*Internet地址簇,AF_INET*/ char sa_data14; /*目标地址和端口信息*/ ;,通用套接字地址结构图,sin_zero8,IPv4套接字地址结构图,sa_data14,2.2 域和地址簇(2),(2)INET协议簇地址结构sockaddr_in,便于访问 struct sockaddr_in unsigned short sin_family; /*取AF_INET*/ unsigned short sin_port; /*端口号,网络字节顺序*/ struct in_addr sin_addr; /*IP地址,网络字节顺序*/ unsigned char sin_zero8; /*使用bzero()或memset()全部置0,*/ ; 注:指向sockaddr_in 的指针和指向sockaddr的指针可互换使用。 (3)32位IPv4地址结构in_addr struct in_addr unsigned long s_addr;,2.2 域和地址簇(3),说明: 在书中或系统内部定义这些数据结构时,定义了很多宏常量或新的类型名,使用时须逐渐认知。如: sockaddr_in 、sockaddr及in_addr结构分别定义如下: typedef uint16_t in_port_t; typedef unsigned short sa_family_t; struct sockaddr_in sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; unsigned char sin_zero8; struct sockaddr sa_family_t sa_family; char sa_data14; ;,2.2 域和地址簇(4),typedef uint32_t in_addr_t struct in_addr union struct uint8_t s_b1,s_b2,s_b3,s_b4; _S_un_b; struct uint16_t s_w1,s_w2; _S_un_w; in_addr_t _S_addr; _S_un; #define s_addr _S_un._S_addr ; #define s_host _S_un._S_un_b.s_b2 ; #define s_net _S_un._S_un_b.s_b1 ; #define s_imp _S_un._S_w.s_w2 ; #define s_impno _S_un._S_un_b.s_b4 ; #define s_lh _S_un._S_un_b.s_b3 ; ,2.3 地址转换函数(1),字节顺序的转换(网络字节顺序) 主机字节顺序:数据在主机上存放的顺序,与CPU类型和操作系统有关,如16位整数7的存放方式: 网络字节顺序:数据在网络上传输的顺序,约定高位在先,故一般需要转换。,InterX86系列芯片 低位在先,Sun公司Sparc芯片Solaris系统 高位在先,2.3 地址转换函数(2),转换函数: (h:主机host, n:网络network) 函数htons():指Host to Network Short 函数htonl(): 指Host to Network Long 函数ntohs():指Network to Host Short 函数ntohl(): 指Network to Host Long 注: struct sockaddr_in 中sin_port 和sin_addr需转换为网络字节顺序;而sin_family不需转换,只被内核调用,不发送到网络,可以是本机字节顺序。,2.3 地址转换函数(3),初始化一个AF_INET地址 struct sockaddr_in adr_inet; /定义变量adr_inet int adr_len; memset(,2.3 地址转换函数(4),Internet IP地址 网络地址 主机地址 网络掩码 例: IP地址: 9 网络分类: C类网 网络地址: 主机地址: *.*.*.19 网络掩码: 广播地址: 55,2.3 地址转换函数(5),处理IP地址 需包含以下头文件:arpa/inet.h、netinet/in.h、 sys/socket.h (1)点分十进制格式网络地址 函数inet_addr() 原型: unsigned long int inet_addr(char *src) 例:struct sockaddr_in ina; ina.sin_addr.s_addr=inet_addr(“”); 注:(1) inet_addr()返回的地址已经是按照网络字节顺序的,不必调用htonl()。 (2) inet_addr()发生错误时返回-1,编程时需进行错误检查,如: if (ina.sin_addr.s_addr=inet_addr(“”)0) cout“Address Error!”;,2.3 地址转换函数(6),函数inet_aton() 原型: int inet_aton(char *src, struct in_addr *dst) 例:struct sockaddr_in ina; inet_aton(“”,2.3 地址转换函数(7),(2) 网络地址点分十进制格式 函数inet_ntoa() 原型: char *inet_ntoa(struct in_addr in) 例:struct sockaddr_in client; cout“you got a connection from n“ inet_ntoa(client.sin_addr); 注: inet_ntoa()的参数是struct in_addr,而不是unsigned long 函数inet_ntop() (不要求) 原型: char *inet_ntop(int af,void *src,char *dst,size_t cnt),2.3 地址转换函数(8),例题: 源程序名: addr1.cpp 可执行程序: addr1 功能: 用带参数的main()函数输入一个十进制点分格式的IP地址和端口号,输出网络字节顺序的地址和端口号,再将它们转换为十进制点分格式的IP地址和本机顺序端口号并输出。 编译连接: g+ addr1.cpp o addr1 运行程序: ./addr1 9 1234 执行结果为: 320696778 53764 9 1234,2.3 地址转换函数(9),域名服务(简称DNS,将域名转换为网络地址) 函数gethostbyname() 功能:实现域名(或点分十进制)转换为网络地址 包含文件:#include 原型:struct hostent *gethostbyname(char *name); 用到的数据结构: struct hostent char *h_name; /*主机名*/ char *h_aliases; /*主机别名数组*/ int h_addrtype; /*返回地址类型,常为AF_INET*/ int h_length; /*地址长度,用字节数表示*/ char *h_addr_list; /*主机网络地址数组*/ ; #define h_addr h_addr_list0 /*网络字节顺序的IP地址*/,2.3 地址转换函数(10),例:struct hostent *he; struct sockaddr_in server; he=gethostbyname(“”); server.sin_addr=*(struct in_addr *)he-h_addr); 例题 源程序名: addr2.cpp (修改addr1.cpp) 可执行程序: addr2 功能: 用带参数的main()函数输入一个域名和端口号,输出网络字节顺序的地址和端口号,再将它们转换为十进制点分格式的IP地址和本机顺序端口号并输出。 运行程序: ./addr2 9 1234 ./addr2 1234 说明: 用到gethostbyname()函数,关于地址的获取 struct hostent *he; struct sockaddr_in server; he=gethostbyname(“”); server.sin_addr=*(struct in_addr *)he-h_addr); 其中: server.sin_addr=*(struct in_addr *)he-h_addr); 可以写作: server.sin_addr.s_addr=*(unsigned long *)he-h_addr); 使用命令: hostname 获得主机名 more /etc/hosts 查看主机名配置文件,超级用户可以修改.,2.3 地址转换函数(11),端口 当客户要与另一主机上的服务进程进行通信时,除知道IP地址外,还要知道服务进程守侯的端口号。对于服务进程,它监听相应的端口,以接收客户进程的请求。不同的服务对应不同的端口号,其对应关系在文件/etc/services中定义。 一般小于1024的端口由UNIX系统保留,大于1024的端口由用户进程使用(102465535)。,2.3 地址转换函数(12),常见周知口(受操作系统保护,服务程序需root权限编程) /*network standard functions*/ /*host specific functions*/ #define IPPORT_ECHO 7 #define IPPORT_ BOOTPS 67 #define IPPORT_DISCARD 9 #define IPPORT_ BOOTPC 68 #define IPPORT_SYSTAT 11 #define IPPORT_ TFTP 69 #define IPPORT_DAYTIME 13 #define IPPORT_ RJE 77 #define IPPORT_NETSTAT 15 #define IPPORT_ FINGER 79 #define IPPORT_FTP 21 #define IPPORT_ TTYLINK 87 #define IPPORT_TELNET 23 #define IPPORT_ SUPDUP 95 #define IPPORT_SMTP 25 /*Unix TCP sockets*/ #define IPPORT_TIMESERVER 37 #define IPPORT_ EXECSERVER 512 #define IPPORT_ NAMESERVER 42 #define IPPORT_ LOGINSERVER 513 #define IPPORT_ WHOIS 43 #define IPPORT_ CMDSERVER 514 #define IPPORT_ MTP 57 #define IPPORT_ EFSSSERVER 520 /*Unix UDP sockets*/ #define IPPORT_ BIFFUDP 512 #define IPPORT_ WHOSERVER 513 #define IPPORT_ ROUTESERVER 520,2.4 利用套接口通信(1),连接类型 面向连接的方式,即虚电路方式。 在两个连接端点间建立一条虚电路,两端点只有在建立连接后才能传输数据,且传输是可靠的(TCP协议),套接口类型用SOCK_STREAM。例如telnet就采用这种方式。 无连接方式,即数据报方式。 传输报文前不用建立连接。无连接协议的每个报文包含一个完整的传送地址,这种传输是不可靠的(UDP协议), 套接口类型用SOCK_DGRAM 。例如很多聊天室程序。,2.4 利用套接口通信(2),服务器端建立过程 创建socket:socket() 绑定本机端口:bind() 监听端口:listen() 接受连接:accept() 连接的数据传输:send()和recv() 无连接的数据传输:sendto()和recvfrom() 关闭socket:c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年城市交通与规划专业期末考试试题及答案
- 2025注册验船师考试(C级船舶检验专业综合能力)综合能力测试题及答案二
- 2025年高压电工面试必-备知识及模拟题解析
- 2025年R2移动式压力容器充装特种作业证考试题库及答案
- 2025年人力资源专员中级实务操作模拟题及答案
- 样品制作相关知识培训课件
- 公务员面试题目益智题及答案
- 2025年艺术设计专业入学笔试模拟试题及答案解析
- 2025年工会招聘面试高频考点与模拟题解析含答案
- 2025年数据分析师专业技能认证面试题详解
- 2025至2030中国电子束灭菌服务行业项目调研及市场前景预测评估报告
- 模锻工艺培训课件
- 血液透析导管感染
- 静脉溶栓病例汇报
- 国家电投集团招聘考试试题及答案
- 2025届黑龙江省龙东地区数学八下期末学业质量监测试题含解析
- 医疗项目可行性研究报告【范本模板】
- 北京市海淀区师达中学2025年七下数学期末考试试题含解析
- IATF16949:2016内审员培训试卷含答案
- 机械基础教案
- 矿山租用土地协议书
评论
0/150
提交评论