2.2客户服务器模型 令服务器:为用户提供服务的一组协同进程 冷客户:用户 请求 6 客户 服务 5[请求/应答 内核 应答 内核 2[数据链路层」 物理层 网络 √请求/应答协议 2002-6-7 东北大学软件所于戈 第二章分布式通信管理
2002-6-7 东北大学软件所 于戈 第二章 分布式通信管理 11 2.2 客户服务器模型 ❖ 服务器:为用户提供服务的一组协同进程 ❖ 客户:用户 1 2 ✓请求/应答协议
消息格式 struct message long source;/发送者标识* long dest;/接受者标识* long opcode;/操作码:读、写、创建、删除* long result;/返回结果代码:成功、失败* long offset;/读写位置*/ long count;/读写计数*/ char filenameMAX path};/文件名* char data BuF size;/*数据区 2002-6-7 东北大学软件所于戈 第二章分布式通信管理
2002-6-7 东北大学软件所 于戈 第二章 分布式通信管理 12 消息格式 struct message { long source; /* 发送者标识*/ long dest; /* 接受者标识*/ long opcode; /* 操作码:读、写、创建、删除*/ long result; /* 返回结果代码:成功、失败*/ long offset; /* 读写位置*/ long count; /* 读写计数*/ char filename[MAX_PATH}; /* 文件名*/ char data[BUF_SIZE]; /* 数据区*/ }
服务器程序 void main(void struct message mI,m2;/输入、输出的消息* intr;/*返回的执行结果* while(1)i receive( FILE SERVER&m1);/*等待客户请求* case(m1 pcode){/执行请求的操作* case READ: r=do read(&ml, &m2); break; default: r=E BAD OPCODEs m2result=r; send(m1. source.,&m2);/*返回结果* 23o 02-6-7 第二章分布式通信管理 13 东北大学软件所于戈
2002-6-7 东北大学软件所 于戈 第二章 分布式通信管理 13 服务器程序 void main(void){ struct message m1,m2; /* 输入、输出的消息*/ int r; /* 返回的执行结果*/ while (1) { receive(FILE_SERVER,&m1); /* 等待客户请求*/ case(m1.opcode) { /* 执行请求的操作*/ case READ: r = do_read(&m1,&m2); break; : default: r = E_BAD_OPCODE; } m2.result = r; send(m1.source,&m2); /* 返回结果*/ } }
客户程序 int read(char * file, int position, int nbytes, char * bufi struct message mI;/*消息缓冲区* ml opcode=READ;体设置参数* ml offset= position;/读位置 ml count = nbvtes: /*读长度* strcpy(&m1 filename,src)/文件名*/ send( FILE SERVER,&m1);/*发送请求* receive( CLIENT,&m1);/等待服务器应答* f( ml result=OK) strcpy(buf,& ml data);/*置缓冲区* return( ml result);/*返回结果* 2002--7 第二章分布式通信管理 }大学软件所于
2002-6-7 东北大学软件所 于戈 第二章 分布式通信管理 14 客户程序 int read(char *file, int position , int nbytes, char *buf){ struct message m1; /* 消息缓冲区*/ m1.opcode = READ; /* 设置参数*/ m1.offset = position; /* 读位置 */ m1.count = nbytes; /* 读长度 */ strcpy(&m1.filename,src) /* 文件名*/ send(FILE_SERVER, &m1); /* 发送请求*/ receive(CLIENT,&m1); /* 等待服务器应答*/ if(m1.result == OK) strcpy(buf, &m1.data); /* 置缓冲区*/ return(m1.result); /* 返回结果*/ } }
寻址方式( Addressing) 1、机器号+本地标识号 例:UNX 客户 服务器 机器I地址 端口号(port) /* Socket address, internet style. * 内核 struct sockaddr in i short sin family;/*AF INET*/ 请求243.0 2:给19.0响应 u short sin port struct in addr sin addr. char sin zero[8 2002-6-7 第二章分布式通信管理 15 东北大学软件所于戈
2002-6-7 东北大学软件所 于戈 第二章 分布式通信管理 15 寻址方式(Addressing) 1、机器号+本地标识号 例:UNIX – 机器IP地址 – 端口号(port) /* Socket address, internet style. */ struct sockaddr_in { short sin_family; /*AF_INET*/ u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };