




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Linux網(wǎng)絡(luò)編程:用C語言實現(xiàn)的聊天程序(同步通信)通過TCP協(xié)議,用C語言實現(xiàn)的同步聊天程序,注釋寫的比較詳細(xì),個人覺得對字符串處理比較充分,能夠正常編譯運行,拿出來和大家分享一下!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./*設(shè)置服務(wù)器端口*/if(argv2)port=atoi(argv2);elseport=4567;/*設(shè)置服務(wù)器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./*開始連接服務(wù)器*/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服務(wù)器發(fā)來的消息是:else%s,共有字節(jié)數(shù)是:dn,buf,len);if(len0)printf(消息發(fā)送成功,本次共發(fā)送的字節(jié)數(shù)是:dn,len);elseprintf(消息發(fā)送失敗!n);break;/*關(guān)閉連接*/close(sockfd);93.return0;2、服務(wù)器源代碼: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);/*設(shè)置服務(wù)器端口*/0.if(argv2)port=atoi(argv2);elseport=4567;/*設(shè)置偵聽隊列長度*/if(argv3)listnum=atoi(argv3);elselistnum=3;/*設(shè)置服務(wù)器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:/*發(fā)送消息*/bzero(buf,BUFLEN);printf(請輸入發(fā)送給對方的消息:);/*fgets函數(shù):從流中讀取BUFLEN-1個字符*/00013.114.fgets(buf,BUFLEN,stdin);/*打印發(fā)送的消息*/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(消息發(fā)送
11、成功,本次共發(fā)送的字節(jié)數(shù)是:dn,len);elseprintf(消息發(fā)送失敗!n);break;/*接收消息bzero(buf,BUFLEN);len=recv(newfd,buf,BUFLEN,0);if(len0)printf(客戶端發(fā)來的信息是:s,共有字節(jié)數(shù)是:dn,buf,len);elseif(len是;n-否?);bzero(buf,BUFLEN);fgets(buf,BUFLEN,stdin);if(!strncasecmp(buf,y,1)printf(server退出!n);break;119./*關(guān)閉服務(wù)器的套接字*/close(sockfd);return0;3、編譯
12、源代碼:newnew-desktop:/linux/c$gcc-Wallsync-client.c-osync-clientnewnew-desktop:/linux/c$gcc-Wallsync-server.c-osync-server4、運行服務(wù)器程序:newnew-desktop:/linux/c$./sync-server4567socketcreatesuccess!bindsuccess!theserverislistening!聊天開始正在與您聊天的客戶端是::48639請輸入發(fā)送給對方的消息:client消息發(fā)送成功,本次共發(fā)送的字節(jié)數(shù)是:
13、6客戶端發(fā)來的信息是:server,共有字節(jié)數(shù)是:6請輸入發(fā)送給對方的消息:5、運行客戶端程序:newnew-desktop:/linux/c$./sync-client4567socketcreatesuccess!conncetsuccess!服務(wù)器發(fā)來的消息是:client,共有字節(jié)數(shù)是:6請輸入發(fā)送給對方的消息:server消息發(fā)送成功,本次共發(fā)送的字節(jié)數(shù)是:6linux網(wǎng)絡(luò)編程:用C語言實現(xiàn)的聊天程序(異步通信)本片文章,在上一篇:linux網(wǎng)絡(luò)編程:用C語言實現(xiàn)的聊天程序(同步通信)的基礎(chǔ)上,增加了IO復(fù)用的功能,實現(xiàn)了聊天程序的異步通訊!1、使用IO復(fù)用可以在等
14、待的時候加入了超時的時間,如果等待的時間沒有達到超時時間那么該情況與阻塞的情況一致。而當(dāng)超時的時間到達時,仍沒有數(shù)據(jù)接收到,系統(tǒng)回返回0,不再等待。select函數(shù)就實現(xiàn)了這個功能。2、select函數(shù)原型intselect(intmaxfdp1,fd_set*readset,fd_set*writeset,fd_set*exceptset,conststructtimeval*timeout);返回值0:就緒的描述符-1:出錯0:超時structtimevallongtv_sec;/secondslongtv_usec;/microseconds具體解釋select的參數(shù)intmaxfdp是
15、一個整數(shù)值,是指集合中所有文件描述符的范圍,即所有文件描述符的最大值加1;fd_set*readfds文件描述符集合內(nèi),是否有數(shù)據(jù)可讀;fd_set*writefds文件描述符集合內(nèi),是否有數(shù)據(jù)可寫;fd_set*errorfds文件描述符集合內(nèi),是否有文件發(fā)生錯誤;structtimeval*timeout是select的超時時間,它可以使select處于三種狀態(tài),第一,若將NULL以形參傳入,就是將select置于阻塞狀態(tài);第二,若將時間值設(shè)為0秒0毫秒,就變成一個純粹的非阻塞函數(shù),不管文件描述符是否有變化,都立刻返回繼續(xù)執(zhí)行,文件無變化返回0,有變化返回一個正值;第三,timeout的值
16、大于0,這就是等待的超時時間,即select在timeout時間內(nèi)阻塞。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);/*設(shè)置服務(wù)器端口*/if(argv2)port=atoi(argv2);elseport=4567;/*設(shè)置服務(wù)器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);/*開始連接服務(wù)器*/if(connect(sockfd,(structsockaddr*)&s_addr,sizeof(structsockaddr)=-1)perror(connect);exit(errno);elseprintf(conncetsuccess!n);while(1)/*把可讀文件描述符的集合清空*/FD_ZERO(&rfds);/*把標(biāo)準(zhǔn)輸入
20、的文件描述符加入到集合中*/FD_SET(0,&rfds);maxfd=0;/*把當(dāng)前連接的文件描述符加入到集合中*/FD_SET(sockfd,&rfds);/*找出文件描述符集合中最大的文件描述符*/if(maxfd0)printf(服務(wù)器發(fā)來的消息是:s,共有字節(jié)數(shù)是:dn,buf,len);elseif(len0)115.printf(t消息發(fā)送成功,本次共發(fā)送的字節(jié)數(shù)是:dn,len);116.else117.printf(消息發(fā)送失敗!n);118.break;22.123.124./*關(guān)閉連接*/125.close(sockfd);126.127.ret
21、urn0;128.4、服務(wù)器源代碼: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);/*設(shè)置服務(wù)器端口
23、*/if(argv2)port=atoi(argv2);elseport=4567;/*設(shè)置偵聽隊列長度*/if(argv3)listnum=atoi(argv3);elselistnum=3;/*設(shè)置服務(wù)器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);/*把標(biāo)準(zhǔn)輸入的文件描述符加入到集
26、合中*/FD_SET(0,&rfds);maxfd=0;/*把當(dāng)前連接的文件描述符加入到集合中*/FD_SET(newfd,&rfds);/*找出文件描述符集合中最大的文件描述符*/if(maxfd0)printf(t消息發(fā)送成功,本次共發(fā)送的字節(jié)數(shù)是:dn,len);elseprintf(消息發(fā)送失敗!n);break;0045.146./*客戶端發(fā)來了消息*/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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 買車合同買賣合同范本
- 廠房分租裝修合同范本
- 怎么講課題申報書
- 單方解除租賃合同范本
- 出口鱘魚合同范本
- 入股石礦合同范本
- 臨時駐地建設(shè)合同范例
- 保健按摩合同范本
- 合同范本教程租房文字
- 員工合同范本修訂
- 2025年服裝制版師(中級)職業(yè)技能鑒定考試題(附答案)
- 高考模擬作文“中國游”“city不city”導(dǎo)寫及范文
- 福建省福州市2024-2025學(xué)年九年級上學(xué)期期末語文試題(解析版)
- 一年級下冊綜合實踐活動教案2
- 九年級主題班會課件:遇見最好的自己(開學(xué)第一課)
- 2025版股權(quán)投資基金股份收購與退出機制協(xié)議3篇
- 【營銷方案】2025小紅書平臺營銷通案
- 2025年江西電力職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年棗莊科技職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 護苗行動安全教育課件
- 2024年湖南鐵道職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
評論
0/150
提交評論