linux下的聊天程序_第1页
linux下的聊天程序_第2页
linux下的聊天程序_第3页
linux下的聊天程序_第4页
linux下的聊天程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统实 验 报 告 课程名称 操作系统 实验学期 2011 至 2012 学年 第 一 学期学生所在系部 通信工程系 年级 2008 专业班级 010812班 学生姓名 路遥 学号 01081191 任课教师 陈晨 实验成绩 通信工程系制课前资料:l 参考资料查阅工具:man,如man ls,man make;l C编写手册,机器上“linux c参考”;l Shell编写手册,机器上“linux shell参考“;l Makefile编写手册,机器上“makefile参考“;l Awk编写手册,机器上“awk参考“;l 经典书籍,学习linux,unix的最佳书籍“Linux,unix

2、shell编程指南“一、 实验题目:熟悉linux操作系统下最简单实用的通信程序socket.最好能全部完成,否则按照完成情况打分。二、 实验目的:通过对socket的编写,可以了解linux下最简单实用的进程通信方法,为后续信号灯、消息队列等学习奠定基础。三、 实验设备及环境:1. 硬件设备:PC机一台2. 软件环境:安装Linux操作系统,并安装相关的程序开发环境,如C C+tshbsh等编程语言环境。四、 实验内容及要求:(1)用C语言编程实现linux简单的聊天室功能。n 用户程序命名为client.c;服务器程序命名为 绑定端口等信息见实验方法内容;n 要求clie

3、nt可以通过socket连接serveru 在client,提示输入服务器ipu 若连接server 的socket建立成功,返回提示信息u Client输入的聊天内容在client端(多个client端)和server端同时显示;u 多个client可同时接入server,进入聊天室,最多支持20个client;u Client端输入quit退出连接,server端提示client退出。u 可选择使用多线程实现多客户端;u 其他细节见输出结果;五、实验方法内容1. 需要的头文件#include<stdlib.h>#include<stdio.h>#include<

4、;string.h>#include<errno.h>#include<netdb.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#include<sys/wait.h>#include<unistd.h>#include<pthread.h>2. 主要的常量变量客户端:#define TRUE 1#define PORT 5000int quit=0; /quit表示是否用户确定退出服务器端:#defin

5、e MAXLINE 1000 /在一条消息中最大的输出字符数#define LISTENQ 20 /最大监听队列#define PORT 5000 /监听端口#define MAXFD 20 /最大的在线用户数量void *get_client(void *); int i,maxi=-1;/maxi表示当前client数组中最大的用户的i值int clientMAXFD;3. 主要模块客户端:int main(void)void *get_server(void* sockfd) /get_server函数,用于接受服务器转发的消息服务器端:int main() void *get_clie

6、nt(void *sockfd) /运行get_client函数,处理用户请求六代码考虑大家没做过,给几个例子:参考socket编程.pdf/* 客户端程序 client.c */#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#d

7、efine 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(nbytes>0)mesnbytes='0'printf("%sn",mes);pthread_exit(NULL);int main(int argc, char *argv)/int sock

8、fd;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; /* thread's structure */if(argc!=1)fprintf(stderr,"Usage:%s an",argv0);

9、exit(1);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&qu

10、ot;,strerror(errno);exit(1);/* 客户程序填充服务端的资料 */bzero(&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 *

11、)(&server_addr),sizeof(struct sockaddr)=-1)fprintf(stderr,"Connect Error:%san",strerror(errno);exit(1);/* 连接成功了 */printf("链接服务器成功n欢迎来到聊天室n");printf("请输入你的用户昵称n");scanf("%s",clientname);/write(sockfd,clientname,sizeof(clientname);printf("nn开始聊天吧("

12、Quit"断开连接)nn");thr_id = pthread_create(&p_thread, NULL, recvfromserver, NULL);while(1)memset(buffer,0,sizeof(buffer);memset(mes,0,sizeof(mes);scanf("%s",buffer);strcat(mes,clientname);strcat(mes,":");strcat(mes,buffer);/printf("main thread %sn",mes);if(wri

13、te(sockfd,mes,sizeof(mes)=-1)fprintf(stderr,"Write Error:%sn",strerror(errno);exit(1);if(strcmp(buffer,"Quit")=0)break;/* 结束通讯 */close(sockfd);exit(0);/* 服务器程序 (server.c) */#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include

14、<netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#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值stat

15、ic int clientMAXFD;void recvandsend(void) /监听转发线程入口函数int index=0;int nbytes=0;char buffer1024;int len;int outindex=0;while(1)if(maxi>0)memset(buffer,0,sizeof(buffer);nbytes=0;/index+;nbytes=read(clientindex+,buffer,sizeof(buffer);/printf("%d,%dn",index,clientindex);if(nbytes>0)buffer

16、nbytes='0'printf(" %sn",buffer);outindex=0;while(outindex<maxi)if(write(clientoutindex+,buffer,sizeof(buffer)=-1)fprintf(stderr,"Write Error:%sn",strerror(errno);exit(1);if(index>=maxi)index=0;pthread_exit(NULL);int main(int argc, char *argv)/int client_fdLISTENQ,cl

17、ientnum=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; /* thread ID for the newly created thread */pthread_t p_thread; /* thread's structure */int new_fd=0;memset(client,0,sizeof(client);if(argc!=1)f

18、printf(stderr,"Usage:%s portnumberan",argv0);exit(1);/* 服务器端开始建立 socket 描述符 */if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)fprintf(stderr,"Socket error:%sna",strerror(errno);exit(1);/* 服务器端填充 sockaddr 结构 */bzero(&server_addr,sizeof(struct sockaddr_in);server_addr.sin_family=AF_

19、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 sockaddr)=-1)fprintf(stderr,"Bind error:%sna",strerror(errno);exit(1);printf("服务器监听端口%d.n",PORT);/* 监听 sockfd

20、描述符 */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)/* 服务器阻塞,直到客户程序建立连接 */if(maxi>=20)printf("以达到人数上线n");continue;sin_size=sizeof(str

21、uct 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. 执行结果l 服务器打开l 客户端打开,并输入了地址,昵称l 服务器端显示l 客户

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论