Linux网络编程:用C语言实现的聊天程序(同步通信)_第1页
Linux网络编程:用C语言实现的聊天程序(同步通信)_第2页
Linux网络编程:用C语言实现的聊天程序(同步通信)_第3页
Linux网络编程:用C语言实现的聊天程序(同步通信)_第4页
Linux网络编程:用C语言实现的聊天程序(同步通信)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、Linux网络编程:用C语言实现的聊天程序(同步通信)通过TCP协议,用C语言实现的同步聊天程序,注释写的比较详细,个人觉得对字符串处理比较充分,能够正常编译运行,拿出来和大家分享一下!1、客户端源代码:cppviewplaincopyprint?#include#include#include#include#include#include#include#include#include10.#defineBUFLEN1012.intmain(intargc,char*argv)intsockfd;structsockaddr_ins_addr;socklen_tlen;unsignedin

2、tport;charbufBUFLEN;20./*建立socket*/if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)perror(socket);exit(errno);elseprintf(socketcreatesuccess!n);27.28./*设置服务器端口*/if(argv2)port=atoi(argv2);elseport=4567;/*设置服务器ip*/bzero(&s_addr,sizeof(s_addr);s_addr.sin_family=AF_INET;s_addr.sin_port=htons(port);if(inet_at

3、on(argv1,(structin_addr*)&s_addr.sin_addr.s_addr)=0)perror(argv1);exit(errno);0.81./*开始连接服务器*/if(connect(sockfd,(structsockaddr*)&s_addr,sizeof(structsockaddr)=-1)perror(con

4、nect);exit(errno);elseprintf(conncetsuccess!n);while(1)/*接收消息bzero(buf,BUFLEN);len=recv(sockfd,buf,BUFLEN,0);if(len0)prints服务器发来的消息是:else%s,共有字节数是:dn,buf,len);if(len0)printf(消息发送成功,本次共发送的字节数是:dn,len);elseprintf(消息发送失败!n);break;/*关闭连接*/close(sockfd);93.return0;2、服务器源代码:cppviewplaincopyprint?#include#

5、include#include#include#include#include#include#include#include10.#defineBUFLEN1012.intmain(intargc,char*argv)intsockfd,newfd;structsockaddr_ins_addr,c_addr;charbufBUFLEN;socklen_tlen;unsignedintport,listnum;20./*建立socket*/if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)perror(socket);exit(errno);elsepri

6、ntf(socketcreatesuccess!n);/*设置服务器端口*/0.if(argv2)port=atoi(argv2);elseport=4567;/*设置侦听队列长度*/if(argv3)listnum=atoi(argv3);elselistnum=3;/*设置服务器ip*/bzero(&s_addr,sizeof(s_addr

7、);s_addr.sin_family=AF_INET;s_addr.sin_port=htons(port);if(argv1)s_addr.sin_addr.s_addr=inet_addr(argv1);elses_addr.sin_addr.s_addr=INADDR_ANY;/*把地址和端口帮定到套接字上*/if(bind(sockfd,(structsockaddr*)&s_addr,sizeof(structsockaddr)=-1)perror(bind);exit(errno);elseprintf(bindsuccess!n);/*侦听本地端口*/if(listen(soc

8、kfd,listnum)=-1)perror(listen);exit(errno);elseprintf(theserverislistening!n);while(1)printf(聊天开始n);len=sizeof(structsockaddr);if(newfd=accept(sockfd,(structsockaddr*)&c_addr,&len)=-1)perror(accept);exit(errno);elseprintf(正在与您聊天的客户端是:s:%dn,inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port);while(1)re

9、try:/*发送消息*/bzero(buf,BUFLEN);printf(请输入发送给对方的消息:);/*fgets函数:从流中读取BUFLEN-1个字符*/00013.114.fgets(buf,BUFLEN,stdin);/*打印发送的消息*/fputs(buf,stdout);if(!strncasecmp(buf,q

10、uit,4)printf(server请求终止聊天!n);break;/*如果输入的字符串只有n,即回车,那么请重新输入*/if(!strncmp(buf,n,1)printf(输入的字符只有回车,这个是不正确的!n);goto_retry;/*如果buf中含有n,那么要用strlen(buf)-1,去掉n*/if(strchr(buf,n)len=send(newfd,buf,strlen(buf)-1,0);/*如果buf中没有n,则用buf的真正长度strlen(buf)*/elselen=send(newfd,buf,strlen(buf),0);if(len0)printf(消息发送

11、成功,本次共发送的字节数是:dn,len);elseprintf(消息发送失败!n);break;/*接收消息bzero(buf,BUFLEN);len=recv(newfd,buf,BUFLEN,0);if(len0)printf(客户端发来的信息是:s,共有字节数是:dn,buf,len);elseif(len是;n-否?);bzero(buf,BUFLEN);fgets(buf,BUFLEN,stdin);if(!strncasecmp(buf,y,1)printf(server退出!n);break;119./*关闭服务器的套接字*/close(sockfd);return0;3、编译

12、源代码:newnew-desktop:/linux/c$gcc-Wallsync-client.c-osync-clientnewnew-desktop:/linux/c$gcc-Wallsync-server.c-osync-server4、运行服务器程序:newnew-desktop:/linux/c$./sync-server4567socketcreatesuccess!bindsuccess!theserverislistening!聊天开始正在与您聊天的客户端是::48639请输入发送给对方的消息:client消息发送成功,本次共发送的字节数是:

13、6客户端发来的信息是:server,共有字节数是:6请输入发送给对方的消息:5、运行客户端程序:newnew-desktop:/linux/c$./sync-client4567socketcreatesuccess!conncetsuccess!服务器发来的消息是:client,共有字节数是:6请输入发送给对方的消息:server消息发送成功,本次共发送的字节数是:6linux网络编程:用C语言实现的聊天程序(异步通信)本片文章,在上一篇:linux网络编程:用C语言实现的聊天程序(同步通信)的基础上,增加了IO复用的功能,实现了聊天程序的异步通讯!1、使用IO复用可以在等

14、待的时候加入了超时的时间,如果等待的时间没有达到超时时间那么该情况与阻塞的情况一致。而当超时的时间到达时,仍没有数据接收到,系统回返回0,不再等待。select函数就实现了这个功能。2、select函数原型intselect(intmaxfdp1,fd_set*readset,fd_set*writeset,fd_set*exceptset,conststructtimeval*timeout);返回值0:就绪的描述符-1:出错0:超时structtimevallongtv_sec;/secondslongtv_usec;/microseconds具体解释select的参数intmaxfdp是

15、一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1;fd_set*readfds文件描述符集合内,是否有数据可读;fd_set*writefds文件描述符集合内,是否有数据可写;fd_set*errorfds文件描述符集合内,是否有文件发生错误;structtimeval*timeout是select的超时时间,它可以使select处于三种状态,第一,若将NULL以形参传入,就是将select置于阻塞状态;第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;第三,timeout的值

16、大于0,这就是等待的超时时间,即select在timeout时间内阻塞。4个宏可以操作文件描述符的集合voidFD_ZERO(fd_set*fdset);/初始化文件描述集合voidFD_SET(intfd,fd_set*fdset);/将描述符加入到集合中voidFD_CLR(intfd,fd_set*fdset);/将描述符中集合中删除intFD_ISSET(intfd,fd_set*fdset);/检查描述符集合中指定的文件描述符是否可读写3、客户端源代码:cppviewplaincopyprint?1.#include2.#include3.#include4.#include5.#i

17、nclude6.#include7.#include8.#include9.#include10.#include11.12.#defineBUFLEN102413.14.intmain(intargc,char*argv)7.58.59.intsockfd;structsockaddr_ins_addr;socklen_tlen;unsign

18、edintport;charbufBUFLEN;fd_setrfds;structtimevaltv;intretval,maxfd;/*建立socket*/if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)perror(socket);exit(errno);elseprintf(socketcreatesuccess!n);/*设置服务器端口*/if(argv2)port=atoi(argv2);elseport=4567;/*设置服务器ip*/bzero(&s_addr,sizeof(s_addr);s_addr.sin_family=AF_INET;

19、s_addr.sin_port=htons(port);if(inet_aton(argv1,(structin_addr*)&s_addr.sin_addr.s_addr)=0)perror(argv1);exit(errno);/*开始连接服务器*/if(connect(sockfd,(structsockaddr*)&s_addr,sizeof(structsockaddr)=-1)perror(connect);exit(errno);elseprintf(conncetsuccess!n);while(1)/*把可读文件描述符的集合清空*/FD_ZERO(&rfds);/*把标准输入

20、的文件描述符加入到集合中*/FD_SET(0,&rfds);maxfd=0;/*把当前连接的文件描述符加入到集合中*/FD_SET(sockfd,&rfds);/*找出文件描述符集合中最大的文件描述符*/if(maxfd0)printf(服务器发来的消息是:s,共有字节数是:dn,buf,len);elseif(len0)115.printf(t消息发送成功,本次共发送的字节数是:dn,len);116.else117.printf(消息发送失败!n);118.break;22.123.124./*关闭连接*/125.close(sockfd);126.127.ret

21、urn0;128.4、服务器源代码:cppviewplaincopyprint?1.#include2.#include3.#include4.#include5.#include6.#include7.#include8.#include9.#include10.#include11.12.#defineBUFLEN102413.14.intmain(intargc,char*argv)15.16.intsockfd,newfd;

22、9.60.structsockaddr_ins_addr,c_addr;charbufBUFLEN;socklen_tlen;unsignedintport,listnum;fd_setrfds;structtimevaltv;intretval,maxfd;/*建立socket*/if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)perror(socket);exit(errno);elseprintf(socketcreatesuccess!n);/*设置服务器端口

23、*/if(argv2)port=atoi(argv2);elseport=4567;/*设置侦听队列长度*/if(argv3)listnum=atoi(argv3);elselistnum=3;/*设置服务器ip*/bzero(&s_addr,sizeof(s_addr);s_addr.sin_family=AF_INET;s_addr.sin_port=htons(port);if(argv1)s_addr.sin_addr.s_addr=inet_addr(argv1);elses_addr.sin_addr.s_addr=INADDR_ANY;/*把地址和端口帮定到套接字上*/if(bi

24、nd(sockfd,(structsockaddr*)&s_addr,sizeof(structsockaddr)=-1)perror(bind);exit(errno);elseprintf(bindsuccess!n);/*侦听本地端口*/if(listen(sockfd,listnum)=-1)perror(listen);exit(errno);elseprintf(theserverislistening!n);8.89.

25、9.while(1)printf(聊天开始n);len=sizeof(structsockaddr);if(newfd=accept(sockfd,(structsockaddr*)&c_addr,&len)=-1)perror(accept);exit(errno);elseprintf(正在与您聊天的客户端是:%s:%dn,inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port);while(1)/*把可读文件描述符的集合清空*/FD_ZERO(&rfds);/*把标准输入的文件描述符加入到集

26、合中*/FD_SET(0,&rfds);maxfd=0;/*把当前连接的文件描述符加入到集合中*/FD_SET(newfd,&rfds);/*找出文件描述符集合中最大的文件描述符*/if(maxfd0)printf(t消息发送成功,本次共发送的字节数是:dn,len);elseprintf(消息发送失败!n);break;0045.146./*客户端发来了消息*/if(FD_ISSET(newfd,&rfds)/*接收消息bzero(buf,BUFLEN);len=recv(newfd,buf,BUFLEN,0);if(len0)pri

温馨提示

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

评论

0/150

提交评论