




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、西 安 邮 电 大 学通过socket 远端进程相互通信课程名称: 高级操作系统实验 专 业: 软件工程 学生学号: 1303210047 学生姓名: 李力目 录一、服务端 timeserv.c 时间服务程序的编写以及分析: . . 3二、调试timeserv 以及问题 . . 8三、问题解决方法 . 9四、Socket 远程通信流程图 . 10一、服务端 timeserv.c 时间服务程序的编写以及分析:本节我所分享的学习重点是如何建立一个socket ,实现不同进程间通过地址进行通信。下面通过我对代码分步骤解释,来分表阐述: 建立socket 服务器端进程需要的主要过程分为七个步骤,分别如
2、下所述: 文件头:/* * 1 socket (创建socket 接口,并分配相对应的id* 2 bind (给对应的id ,分配主机名以及端口 * 3 listen (允许指定的id 接入* 4 accept (阻塞进程,并等待接入* 5 fdopen (接入成功并打开文件* 6 write (传输数据* 7 close (关闭数据* */#include<.>#define PORTNUM 13000 /portnum作为socket 的端口号#define HOSTLEN 256 /主机明字符串长度int main(int ac,char *avstruct sockaddr
3、_in saddr; /*创建socket 地址结构体*/struct hostent *hp; /*创建hostent 指针,指向主机号对应信息结构体*/char hostnameHOSTLEN;int sock_id,sock_fd;FILE *sock_fp;char *ctime(;time_t thetime;第一步:申请socket ,创建socket 接口,并分配相对应的id 。 /* Step 1: ack kernel for socket*/1.1获得一个socket 接口sock_id = socket(PF_INET,SOCK_STREAM,0;if(sock_id =
4、 -1 oops("socket"我们看一下socket 函数的声明:int socket(int domain, int type, int protocol; 我们采用socket(PF_INET,SOCK_STREAM,0的方式调用该函数;PF_INET:协议族。其中PF_INET 表示ADDRESS FAMILY 地址族, PF 表示PROTOCOL FAMILY 协议族,但这两个宏定义是一样的,所以使用哪个都没有关系。Winsock2.h 中#define AF_INET 2,#define PF_INET AF_INET,所以在windows 中AF_INET与
5、PF_INET完全一样。而在Unix/Linux系统中,在不同的版本中这两者有微小差别。对 于BSD, 是AF, 对于POSIX 是PF 。UNIX 系统支持AF_INET,AF_UNIX,AF_NS等。而DOS,Windows 中仅支持AF_INET,它是网际网区域。SOCK_STREAM:字段所表示的含义为: 提供一系列的, 可靠的,双向的, 基于字符的链接流. 并且支持带外数据(OOB )传输机. ( OOB 带外数据;传输层协议使用带外数据来发送一些重要数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速的送达对方,而不使用与普通数据相同的通道,而是使用另外通道,如TC
6、P 协议支持紧急模式,可采用其他方式发送数据)。第二步:主机端口地址与sock_id绑定。/* Step 2: bind address to socket , Address is host,port*/2.1 首先清空之前声明的sockaddr_in结构体类型saddr 的内容 bzero(void *&saddr,sizeof(saddr;/2.2并获得当前进程所在主机名gethostname(hostname, HOSTLEN;/2.3通过gethostbyname 获得主机信息结构体hp = gethostbyname(hostname;dd/2.4 以下三步骤为填充/的过程
7、函数定义:void bcopy(const void *src, void *dest, size_t n;bcopy(void *hp->h_addr, (void *&saddr.sin_addr, hp->h_length; saddr.sin_port = htons(PORTNUM;/填入端口号saddr.sin_family = AF_INET;/填入地址族/2.5将填充网络地址等信息的sockaddr 结构体saddr 与第一步中获取的/sock_id通过 bind(sock_id,(struct sockaddr *&saddr,sizeof(sad
8、dr函数 /进行绑定, 可使用域名进行访问 if(bind(sock_id,(struct sockaddr *&saddr,sizeof(saddr!=0oops("bind"第二步的主要内容就是令第一步中分配的socket 与某一固定的主机端口绑定,可以令其他进程通过主机域名进行访问。由于第一步分配socket 后已获得唯一指向该socket 的sock_id 。则只需要获得主机和域名的结构体,并令两者通过bind 函数进行绑定即达到目的。在代码声明部分有 struct sockaddr_in saddr; 通过查看/usr/include/i386-linux
9、-gnu/socket.h头文件,我们获知sockaddr_in结构体的定义如下:struct sockaddr_in_SOCKADDR_COMMON (sin_;in_port_t sin_port; /* Port number. */struct in_addr sin_addr; /* Internet address. */* Pad to size of struct sockaddr'. */unsigned char sin_zerosizeof (struct sockaddr -_SOCKADDR_COMMON_SIZE -sizeof (in_port_t - s
10、izeof (struct in_addr;其中sin_port为端口号,sin_addr网络地址, 我们通过bcopy 函数将hp->h_addr 所指向的主机地址给sin_add。将在头文件中自定义给出的端口号PORTNUM 13000给 sin_port。所有部分被填充完毕之后,通过bind(sock_id,(struct sockaddr *&saddr,sizeof(saddr,将二者绑定起来。第三步:时刻监听socket 是否有进程访问,并且对访问进程队列进行设置。/* Step 3: allow incoming calls with Qsize=1 on sock
11、et*/通过listen(int sockfd, int backlog 函数,/允许sock_id所指的socket 接入呼叫,并设置等待队列长度为1if(listen(sock_id,1!=0oops("listen"/* main loop :accpet(,write(,close(*/while(1/* * Step 4:* 通过 accept(int sockfd, struct sockaddr *addr, socklen_t addrlen; * 阻碍当前进程,直到sock_id所指定的socket 有进程访问,并接通则继 * 续执行,accept 将返回
12、文件描述符,用作被访问socket 程序读写入访问 * 程序* */sock_fd = accept(sock_id,NULL,NULL;printf("WOW!got a call! n"if(sock_fd = -1oops("accept"/* Step 5:* 通过fdopen 将accept 函数中返回的访问socket 文件描述定向,以进行 * 读写*/sock_fd = fdopen(sock_fd,"w"if(sock_fp=NULLoops("fdopen"thetime = time(NULL;
13、/* Step 6:* 利用close 关闭系统描述符*/fprintf(sock_fp,"the time here is ."fprintf(sock_fp,"%s",ctime(&thetime;fclose(sock_fp;二、调试timeserv 以及问题第一次使用本机访问时出现:&符为启动服务符,使进程阻塞于accept 之上。leeLEE:$ ./timeserv&1 4484leeLEE:$ ./timeserv&2 4485leeLEE:$ bind: Address already in useteln
14、et lee 13000WOW!got a call!Connected to LEE.Escape character is ''.Connection closed by foreign host.1- 段错误 (核心已转储 ./timeserv2+ 退出 1 ./timeserv调试结果:rootLEE:/home/lee# ./timeserv&1 6383rootLEE:/home/lee# ./timeserv&2 6384rootLEE:/home/lee# bind: Address already in usetelnet lee 13000WOW!got a call!accept: SuccessConnected to LEE.Escape character is ''.Connection closed by foreign host.1- 退出 1 ./timeserv2+ 退出 1 ./timeserv三、问题解决方法出现段错误后反复调试也没发现错误,最后发现是一个字母出现问题。即 sock_fp = fdopen(sock_fd,"w"最终运行成功的结果为:leeLEE:$ ./timeserv&1 55
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖北省孝感市2025-2026学年高二上学期9月起点考试政治试卷(含解析)
- 【高中语文】《百合花》课件+统编版高一语文必修上册
- 2025年公共能力测试题目及答案
- 高三试卷:2025届喀什二中9月份月考-物理
- 抗干扰目标检测方法-洞察及研究
- 园林工具政策影响分析-洞察及研究
- 企业报告与文件写作模板库
- 2025年中国裤耳专用暗缝机数据监测报告
- 2025年中国野外用户分配放大器数据监测研究报告
- 2025年中国红蜡片数据监测报告
- 191118-锂离子电池专业术语英语对照大全
- 打包机吊装方案
- 如何列好小说提纲
- 【新教材】部编道德与法治六年级上册-全册-表格式教案教学设计
- 文言实词本义引申义
- 第八届全国职工职业技能大赛(网络和信息安全管理员)海南省赛试题库-下(多选、判断题)
- 07J902-3 医疗建筑(卫生间、淋浴间、洗池)
- 2024年电工(高级技师)职业鉴定理论考试题库-下(多选、判断题)
- 2024年网上大学智能云服务交付工程师认证考试题库800题(含答案)
- 公共数据交换技术规范
- 成都麓湖生态城案例详解
评论
0/150
提交评论