- 1、本文档共64页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 Socket程序设计.ppt
1 基本概念 网间进程通信 网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。 其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。 1 基本概念 端口 端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问。 1 基本概念 端口 端口号的分配有两种基本分配方式:全局分配;本地分配 TCP/IP端口号的分配中综合了上述两种方式。TCP/IP将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口(即周知口,well-known port),即使在不同机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。 1 基本概念 地址 网络通信中通信的两个进程分别在不同的机器上。在互连网络中,两台机器可能位于不同的网络,这些网络通过网络互连设备(网关,网桥,路由器等)连接。因此需要三级寻址:1. 某一主机可与多个网络相连,必须指定一特定网络地址;2. 网络上每一台主机应有其唯一的地址;3. 每一主机上的每一进程应有在该主机上的唯一标识符。??? 通常主机地址由网络ID和主机ID组成,在TCP/IP协议中用32位整数值表示;TCP和UDP均使用16位端口号标识用户进程。 1基本概念 网络字节顺序?? 不同的计算机存放多字节值的顺序不同,因此为保证数据的正确性,在网络协议中须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式。 连接??? 两个进程间的通信链路称为连接。连接在内部表现为一些缓冲区和一组协议机制,在外部表现出比无连接高的可靠性。 1基本概念 半相关? 网络中用一个三元组可以在全局唯一标志一个进程:??? (协议,本地地址,本地端口号)?? ? 这样一个三元组,叫做一个半相关(half-association),它指定连接的每半部分。 全相关?? ? 一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。。因此一个完整的网间通信需要一个五元组来标识:???? (协议,本地地址,本地端口号,远地地址,远地端口号)???? 这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。 5 命名套接字 5 命名套接字 3 套接字地址 3 套接字地址 3 套接字地址 3 套接字地址 3 套接字地址 3 套接字地址 3 套接字地址 3 套接字地址 3 套接字地址 3 套接字地址 3 套接字地址 6 套接字通信模式 7 流套接字操作 7 流套接字操作 7 流套接字操作 9 数据报套接字 6 套接字通信模式 9 数据报套接字 9 数据报套接字 9 数据报套接字 9 数据报套接字 // client 端程序 int main() { int sock, n; struct sockaddr_in name; char buffer[MAX]; sock = socket( AF_INET, SOCK_DGRAM, 0 ); init_sockaddr( name, “echoserver”, “7” ); while( fgets( buffer, MAX, stdin) != NULL ) { if( sendto(sock,buffer,strlen(buffer), 0, name, sizeof(name)) 0 ) exit(1); if( n = recvfrom(sock, buffer, MAX, 0, NULL, NULL))0) exit(2); printf(“client received message: %s\n”, buffer ); } close( sock ) ; } TCP通信 accept()系统调用指定本地端口
文档评论(0)