版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统实 验 报 告课程名称操作系统实验学期 2011 至 2012 学年 第一 学期学生所在系部通信工程系年级 2008 专业班级 010812班学生姓名路遥学号 01081191 任课教师陈晨实验成绩通信工程系制课前资料:参考资料查阅工具:man,如 man ls,man make; c 编写手册,机器上“linux c 参考 ” ; shell 编写手册,机器上“linux shell 参考“;makefile 编写手册,机器上“makefile 参考“;awk 编写手册,机器上“awk 参考“;经典书籍,学习linux,unix 的最佳书籍“linux ,unix shell 编程指
2、南“一、实验题目:熟悉 linux 操作系统下最简单实用的通信程序socket.最好能全部完成,否则按照完成情况打分。二、实验目的:通过对 socket 的编写,可以了解linux 下最简单实用的进程通信方法,为后续信号灯、消息队列等学习奠定基础。三、实验设备及环境:1. 硬件设备: pc 机一台2. 软件环境:安装linux 操作系统,并安装相关的程序开发环境,如c c+tshbsh 等编程语言环境。四、实验内容及要求:(1)用 c 语言编程实现linux 简单的聊天室功能。用户程序命名为client.c; 服务器程序命名为server.c 绑定端口等信息见实验方法内容;要求 client
3、可以通过socket 连接 server 在 client,提示输入服务器ip 若连接 server 的 socket 建立成功,返回提示信息client 输入的聊天内容在client 端(多个client 端)和 server 端同时显示;多个 client 可同时接入server,进入聊天室,最多支持20 个 client;client 端输入 quit 退出连接, server 端提示 client 退出。可选择使用多线程实现多客户端;其他细节见输出结果;五、实验方法内容1. 需要的头文件#include #include #include #include #include #incl
4、ude #include #include #include #include #include 2. 主要的常量变量客户端:#define true 1 #define port 5000 int quit=0; /quit表示是否用户确定退出服务器端:#define maxline 1000 /在一条消息中最大的输出字符数#define listenq 20 /最大监听队列#define port 5000 /监听端口#define maxfd 20 /最大的在线用户数量void *get_client(void *); int i,maxi=-1;/maxi表示当前 client数组中最
5、大的用户的i 值int clientmaxfd; 3. 主要模块客户端:int main(void) void *get_server(void* sockfd) /get_server函数,用于接受服务器转发的消息服务器端:int main() void *get_client(void *sockfd) /运行 get_client函数,处理用户请求六代码考虑大家没做过,给几个例子:参考 socket 编程 .pdf /* 客户端程序client.c */ #include #include #include #include #include #include #include #inc
6、lude #define true 1 #define port 5000 static int sockfd; void recvfromserver() / 接受服务器消息线程入口函数 char mes1024; int nbytes=0; while(1) memset(mes,0,sizeof(mes); nbytes=read(sockfd,mes,sizeof(mes); if(nbytes0) mesnbytes=0; printf(%sn,mes); pthread_exit(null); int main(int argc, char *argv) / int sockfd;
7、 char buffer1024; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; char strhost16; char clientname20; char mes1024; int thr_id; /* thread id for the newly created thread */ pthread_t p_thread; /* threads structure */ if(argc!=1) fprintf(stderr,usage:%s an,argv0); exit(1);
8、 printf( 请输入服务器ip 地址 n); scanf(%s,strhost); if(host=gethostbyname(strhost)=null) fprintf(stderr,gethostname errorn); exit(1); /* 客户程序开始建立sockfd 描述符*/ printf( 正在建立套接口.n); if(sockfd=socket(af_inet,sock_stream,0)=-1) fprintf(stderr,socket error:%san,strerror(errno); exit(1); /* 客户程序填充服务端的资料*/ bzero(&am
9、p;server_addr,sizeof(server_addr); server_addr.sin_family=af_inet; server_addr.sin_port=htons(port); server_addr.sin_addr=*(struct in_addr *)host-h_addr); printf( 套接口创建成功,正在链接服务器.n); /* 客户程序发起连接请求*/ if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)=-1) fprintf(stderr,co
10、nnect error:%san,strerror(errno); exit(1); /* 连接成功了*/ printf( 链接服务器成功n欢迎来到聊天室n); printf( 请输入你的用户昵称n); scanf(%s,clientname); / write(sockfd,clientname,sizeof(clientname); printf(nn开始聊天吧(quit断开连接) nn); thr_id = pthread_create(&p_thread, null, recvfromserver, null); while(1) memset(buffer,0,sizeof(
11、buffer); memset(mes,0,sizeof(mes); scanf(%s,buffer); strcat(mes,clientname); strcat(mes,:); strcat(mes,buffer); / printf(main thread %sn,mes); if(write(sockfd,mes,sizeof(mes)=-1) fprintf(stderr,write error:%sn,strerror(errno); exit(1); if(strcmp(buffer,quit)=0) break; /* 结束通讯*/ close(sockfd); exit(0
12、); /* 服务器程序(server.c) */ #include #include #include #include #include #include #include #include #define maxline 1000 / 在一条消息中最大的输出字符数#define listenq 20 / 最大监听队列#define port 5000 /监听端口#define maxfd 20 /最大的在线用户数量void *get_client(void *); int sockfd,i; static int maxi=0;/maxi表示当前client 数组中最大的用户的i 值sta
13、tic int clientmaxfd; void recvandsend(void) / 监听转发线程入口函数 int index=0; int nbytes=0; char buffer1024; int len; int outindex=0; while(1) if(maxi0) memset(buffer,0,sizeof(buffer); nbytes=0; /index+; nbytes=read(clientindex+,buffer,sizeof(buffer); / printf(%d,%dn,index,clientindex); if(nbytes0) buffernb
14、ytes=0; printf( %sn,buffer); outindex=0; while(outindex=maxi) index=0; pthread_exit(null); int main(int argc, char *argv) / int client_fdlistenq,clientnum=0; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber; char hello=hello! are you fine?n; int thr_id; /* thre
15、ad id for the newly created thread */ pthread_t p_thread; /* threads structure */ int new_fd=0; memset(client,0,sizeof(client); if(argc!=1) fprintf(stderr,usage:%s portnumberan,argv0); exit(1); /* 服务器端开始建立socket 描述符*/ if(sockfd=socket(af_inet,sock_stream,0)=-1) fprintf(stderr,socket error:%sna,strer
16、ror(errno); exit(1); /* 服务器端填充sockaddr 结构*/ bzero(&server_addr,sizeof(struct sockaddr_in); server_addr.sin_family=af_inet; server_addr.sin_addr.s_addr=htonl(inaddr_any); server_addr.sin_port=htons(port); /* 捆绑sockfd 描述符*/ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockadd
17、r)=-1) fprintf(stderr,bind error:%sna,strerror(errno); exit(1); printf( 服务器监听端口%d.n,port); /* 监听sockfd 描述符*/ if(listen(sockfd,listenq)=-1) fprintf(stderr,listen error:%sna,strerror(errno); exit(1); thr_id = pthread_create(&p_thread, null, recvandsend, null); printf( 欢迎来到本聊天室n); while(1) /* 服务器阻塞
18、 ,直到客户程序建立连接*/ if(maxi=20) printf( 以达到人数上线n); continue; sin_size=sizeof(struct sockaddr_in); if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)=-1) fprintf(stderr,accept error:%sna,strerror(errno); exit(1); /*fprintf(stderr,server get connection from %sn,inet_ntoa(client_addr.sin_addr);*/ clientmaxi+=new_fd; printf(n新用户进入聊天室%dn,new_fd); close(sockfd); exit(0); 七、实验结果1. 执行结果服务器打开客户端打开,并输入了地址,昵称服务器端显示客户端 2 进入服务器显示张三输入李四端显示服务器显示李四输入张三显示服务器显示2. 结果分析这是一个聊天室程序, 可以实现群聊的功能, 即当某个客户发出消息后, 服务器和其他个客
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年医博士全员培训考试题及参考答案
- 临床医师“三基”考试试题(一)及答案
- 2026年继续教育医院感染管理与防控试题及答案
- 产业园项目雨季基坑施工方案
- 体育馆陶板幕墙施工方案
- 全科医学中医类中级真题及答案
- 专升本真题306现代汉语
- 第一单元自测练习卷-2026-2027学年三年级上册语文统编版
- 基础题2026年新版水稻知识检测题及答案试卷+答案
- 家庭芽苗菜测试题
- 2026贵州双龙航空港经济区选聘社区工作者9人笔试题库加答案详解
- 元音音标测试卷及答案
- 2026年广东省中考语文试卷(含答案)
- 2026海南农村商业银行招聘备考题库(202605)及参考答案详解一套
- 2026年医师定期考核妇产科试题及答案解析
- 建筑信息模型施工应用标准
- 华为公司员工手册培训
- 碳酸盐岩的成岩作用课件
- QC工作流程图模板
- 机器学习与深度学习PPT完整全套教学课件
- 2022年南京市建邺区社会工作者招聘考试试题
评论
0/150
提交评论