

已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux课程设计基于linux的socket编程的聊天室设计 专业:计算机科学与技术 班级: 姓名: 学号: 指导老师:郭玉华一、 实验目的基于 socket 套接口,实现聊天程序的设计与实现,增强程序编写能力,了解基于socket的程序设计方法,加深对计算机网络通信的理解。另外,通过课程设计培养自己严谨的科学态度,认真的工作作风、团队协作精神、自主设计和独力思考的能力。二、 实验原理实验中,客户应用程序向服务器程序请求服务。服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被惊醒并且为客户提供服务对客户的请求作出适当的反应。客户端部分:1. 手动输入服务器端ip地址和端口号进行连接2. 发送消息给服务器端并显示服务器端回传的消息3. 监控连接状态,客户离开或故障时从列表中删除相应表项,并及时更新连接表。服务器端部分:1. 手动建立服务器端与客户端的连接请求2. 把用户输入的信息及时发送到服务端,同时准备好接受,并显示信息。3. 在用户退出时关闭连接并保存聊天记录。客户端-服务器端架构:相关函数:socket()函数:int socket(int family,int type,int proto); 1) family 指定 protocol family (pf_inet 对应 tcp/ip). 2) type 指定服务类型 (sock_stream, sock_dgram). 3) protocol 指定协议 (通常0, 代表缺省值). bind()函数 :给socket 绑定一个地址. int bind( int sockfd, const struct sockaddr *myaddr, socklen_t addrlen); bind 返回值 listen()函数:accept()函数:int accept( int sockfd,struct sockaddr* cliaddr, socklen_t *addrlen); sockfd 是被动模式的 tcp socket. cliaddr 指针,指向一个已分配好的空间. 返回客户地址. addrlen 是一个 value-result 参数 必须设置为 cliaddr 的空间大小 返回时, 将被设置为使用 cliaddr 的空间大小.。linux简介:linux操作系统是unix操作系统的一种克隆系统。它诞生于1991年的10月5日。由于linux是开源和免费的,得到了广大计算机爱好者全力支持,现已成为今天世界上使用最多的一种unix类操作系统。其具有的 特点有:开放性:指系统遵循世界标准规范,特别是遵循开放系统互连(osi)国际标准。多用户:是指系统资源可以被不同用户使用,每个用户对自己的资源(例如:文件、设备)有特定的权限,互不影响。多任务:它是指计算机同时执行多个程序,而且各个程序的运行互相独立。良好的用户界面 :linux向用户提供了两种界面,用户界面和系统调用。linux还为用户提供了图形用户界面,它利用鼠标、菜单、窗口、滚动条等设施,给用户呈现一个直观、易操作、交互性强的友好图形化界面。设备独立性:是指操作系统把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以像使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。linux是具有设备独立性的操作系统,它的内核具有高度适应能力,提供了丰富的网络功能,完善的内置网络是linux一大特点。安全性:linux采取了许多安全技术措施,包括对读、写控制、带保护的子系统、审计跟踪、核心授权等,这为网络多用户环境中的用户提供了必要的安全保障。良好的可移植性:是指将操作系统从一个平台转移到另一个平台,它仍然能按其自身的方式运行的能力。linux是一种可移植的操作系统,能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。tcp简介:tcp与udp同为传输层协议。本系统采用的传输协议tcp协议。tcp协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。tcp提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。tcp协议主要特点:1、面向连接的传输;2、端到端的通信;3、高可靠性,确保传输数据的正确性,不出现丢失或乱序;4、全双工方式传输;5、采用字节流方式,即以字节为单位传输字节序列;6、紧急数据传送功能;三、 实验实现/-server.c-/包含工程所需的头文件#include #include#include #include#include #include#include#include#include#include#include#include#include#define perm s_irusr|s_iwusr #define myport 3490 #define backlog 10 #define welcome |-welcome to the chat room! -| void itoa(int i,char*string) int power,j; j=i; for(power=1;j=10;j/=10) power*=10; for(;power0;power/=10) *string+=0+i/power; i%=power; *string=0;void get_cur_time(char * time_str) time_t timep; struct tm *p_curtime; char *time_tmp; time_tmp=(char *)malloc(2); memset(time_tmp,0,2); memset(time_str,0,20); time(&timep); p_curtime = localtime(&timep); strcat(time_str, (); itoa(p_curtime-tm_hour,time_tmp); strcat(time_str,time_tmp); strcat(time_str,:); itoa(p_curtime-tm_min,time_tmp); strcat(time_str,time_tmp); strcat(time_str,:); itoa(p_curtime-tm_sec,time_tmp); strcat(time_str,time_tmp); strcat(time_str,); free(time_tmp);key_t shm_create() key_t shmid; /shmid = shmget(ipc_private,1024,perm); if(shmid = shmget(ipc_private,1024,perm) = -1) fprintf(stderr,create share memory error:%sna,strerror(errno); exit(1); return shmid;int bindport(unsigned short int port) int sockfd; struct sockaddr_in my_addr; sockfd = socket(af_inet,sock_stream,0); my_addr.sin_family = af_inet; my_addr.sin_port = htons(port); my_addr.sin_addr.s_addr = inaddr_any; bzero(&(my_addr.sin_zero),0); if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr) = -1) perror(bind); exit(1); printf(bing success!n); return sockfd;int main(int argc, char *argv) int sockfd,clientfd,sin_size,recvbytes; pid_t pid,ppid; char *buf, *r_addr, *w_addr, *temp, *time_str;/=0; struct sockaddr_in their_addr; key_t shmid; shmid = shm_create(); /创建共享存储区 temp = (char *)malloc(255); time_str=(char *)malloc(20); sockfd = bindport(myport);/绑定端口 while(1) if(listen(sockfd,backlog) = -1)/在指定端口上监听 perror(listen); exit(1); printf(listening.n); if(clientfd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size) = -1)/接收客户端连接 perror(accept); exit(1); printf(accept from:%dn,inet_ntoa(their_addr.sin_addr); send(clientfd,welcome,strlen(welcome),0);/发送问候信息 buf = (char *)malloc(255); ppid = fork(); if(ppid = 0) /printf(ppid=0n); pid = fork(); while(1) if(pid 0) memset(buf,0,255); if(recvbytes = recv(clientfd,buf,255,0) = 0) perror(recv1); close(clientfd); raise(sigkill); exit(1); /write bufs data to share memory w_addr = shmat(shmid, 0, 0); memset(w_addr, 0, 1024); strncpy(w_addr, buf, 1024); get_cur_time(time_str); strcat(buf,time_str); printf( %sn,buf); else if(pid = 0) sleep(1); r_addr = shmat(shmid, 0, 0); if(strcmp(temp,r_addr) != 0) strcpy(temp,r_addr); get_cur_time(time_str); strcat(r_addr,time_str); if(send(clientfd,r_addr,strlen(r_addr),0) = -1) perror(send); memset(r_addr, 0, 1024); strcpy(r_addr,temp); else perror(fork); printf(-n); free(buf); close(sockfd); close(clientfd); return 0;/-client.c-#include#include #include #include #include#include#include#include#include#includeint main(int argc, char *argv) struct sockaddr_in clientaddr; pid_t pid; int clientfd,sendbytes,recvbytes; struct hostent *host; char *buf,*buf_r; if(argc h_addr); bzero(&(clientaddr.sin_zero),0); if(connect(clientfd,(struct sockaddr *)&clientaddr,sizeof(struct sockaddr) = -1) perror(connectn); exit(1); buf=(char *)malloc(120); memset(buf,0,120); buf_r=(char *)malloc(100); if( recv(clientfd,buf,100,0) = -1) perror(recv:); exit(1); printf(n%sn,buf); pid = fork(); while(1) if(pid 0) /get_cur_time(time_str); strcpy(buf,argv3); strcat(buf,:); memset(buf_r,0,100); /gets(buf_r); fgets(buf_r,100,stdin); strncat(buf,buf_r,strlen(buf_r)-1); /strcat(buf,time_str); /printf(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设备保管使用协议书
- 共同成立子公司协议书
- 保洁员签到合同协议书
- app商城代理协议书
- 花草修剪合同协议书
- 门市出租调价协议书
- 船舶买卖交接协议书
- 门市租房安全协议书
- 南宁房地产合作协议书
- csc公派留学协议书
- 2025届高三5月份全国各地联考文言文阅读分类汇编(解析版)
- DL/T5315-2014水工混凝土建筑物修补加固技术规程(完整)
- 2024春期国开电大专科《液压与气压传动》在线形考(形考任务+实验报告)试题及答案
- 乙型肝炎病毒表面抗原胶体金法说明书
- 基于PLC控制的物料分拣系统设计
- 人教部编版七年级历史下册教材插图汇总
- 济南市城乡建设用地增减挂钩试点项目管理办法
- 建筑工程竣工验收报告山西
- 启闭机房脚手架工程施工专项方案
- 变更监事模板
- 标准工程量清单细目编号公路工程
评论
0/150
提交评论