![基于c語(yǔ)言的簡(jiǎn)易網(wǎng)絡(luò)通信軟件_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-6/16/225f69b1-ca87-4de5-b734-47b25906cbd4/225f69b1-ca87-4de5-b734-47b25906cbd41.gif)
![基于c語(yǔ)言的簡(jiǎn)易網(wǎng)絡(luò)通信軟件_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-6/16/225f69b1-ca87-4de5-b734-47b25906cbd4/225f69b1-ca87-4de5-b734-47b25906cbd42.gif)
![基于c語(yǔ)言的簡(jiǎn)易網(wǎng)絡(luò)通信軟件_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-6/16/225f69b1-ca87-4de5-b734-47b25906cbd4/225f69b1-ca87-4de5-b734-47b25906cbd43.gif)
![基于c語(yǔ)言的簡(jiǎn)易網(wǎng)絡(luò)通信軟件_第4頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-6/16/225f69b1-ca87-4de5-b734-47b25906cbd4/225f69b1-ca87-4de5-b734-47b25906cbd44.gif)
![基于c語(yǔ)言的簡(jiǎn)易網(wǎng)絡(luò)通信軟件_第5頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-6/16/225f69b1-ca87-4de5-b734-47b25906cbd4/225f69b1-ca87-4de5-b734-47b25906cbd45.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、#include #include #pragma comment (lib,ws2_32.lib)/客戶(hù)端發(fā)送給服務(wù)端的消息類(lèi)型#define clientsend_exit 1#define clientsend_tran 2#define clientsend_list 3/服務(wù)端發(fā)送給客戶(hù)端的消息類(lèi)型#define serversend_selfid 1#define serversend_newusr 2#define serversend_showmsg 3#define serversend_online 4/定義記錄聊天記錄的文件指針file *ioutfileserver;f
2、ile *ioutfileclient;/服務(wù)端接收消息的結(jié)構(gòu)體,客戶(hù)端使用這個(gè)結(jié)構(gòu)體發(fā)送數(shù)據(jù)struct creceivepackageint itype; /存放消息類(lèi)型int itoid; /存放目標(biāo)用戶(hù)idint ifromid; /存放原用戶(hù)idchar cbuffer1024; /存放消息內(nèi)容;/服務(wù)端發(fā)送消息的結(jié)構(gòu)體,服務(wù)端使用這個(gè)結(jié)構(gòu)體發(fā)送數(shù)據(jù)struct csendpackageint itype; /消息類(lèi)型int icurconn; /當(dāng)前在線(xiàn)用戶(hù)數(shù)量char cbuffer1024; /存放消息內(nèi)容;/服務(wù)端存儲(chǔ)在線(xiàn)用戶(hù)信息的結(jié)構(gòu)體struct cusersocketi
3、nfoint id; /用戶(hù)的idchar cdstip64; /用戶(hù)的ip地址,擴(kuò)展使用int iport; /用戶(hù)應(yīng)用程序端口擴(kuò)展使用socket susersocket; /網(wǎng)絡(luò)句柄;/客戶(hù)端存儲(chǔ)在線(xiàn)用戶(hù)列表的結(jié)構(gòu)體struct cuserint id; /用戶(hù)的idchar cdstip64; /用戶(hù)的ip地址 擴(kuò)展時(shí)使用;struct cuser usr20; /客戶(hù)端存儲(chǔ)用戶(hù)信息的對(duì)象int bsend=0; /是否可以發(fā)送消息int imyself; /自己的idint inew=0; /在線(xiàn)用戶(hù)數(shù)struct cusersocketinfo usrinfo20; /服務(wù)端存儲(chǔ)用
4、戶(hù)信息的對(duì)象/函數(shù)exitsystem用于實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)方式的退出void exitsystem()if(ioutfileserver!=null)fclose(ioutfileserver);if(ioutfileclient!=null)fclose(ioutfileclient);wsacleanup();exit(0);/函數(shù)threadproclient是客戶(hù)端接收消息的線(xiàn)程dword winapi threadproclient(lpvoid pparam)socket hsock=(socket)pparam;char crecvbuffer1024;char cshowbuffer
5、1024;int num=0;if(hsock!=invalid_socket)printf(start:n);while(1)num = recv(hsock,crecvbuffer,1024,0);if(num = 0)crecvbuffernum=0;sprintf(cshowbuffer,to me : %sn,crecvbuffer);printf(%s,cshowbuffer);fwrite(cshowbuffer ,sizeof(char),strlen(cshowbuffer),ioutfileclient);fflush(ioutfileclient);/fflush 清理文
6、件緩存區(qū),文件以寫(xiě)方式打開(kāi)時(shí)將緩沖區(qū)內(nèi)容寫(xiě)入文件,在頭文件stdio.h中,文件原型:int fflush(file*stream)if(strcmp(exit,crecvbuffer)=0)exitsystem();return 0; /結(jié)束線(xiàn)程/函數(shù)threadproserver是服務(wù)端接收消息的線(xiàn)程dword winapi threadproserver(lpvoid pparam)socket hsock=(socket)pparam;char crecvbuffer1024;char cshowbuffer1024;int num=0;if(hsock!=invalid_socket
7、)printf(start:n);while(1)num = recv(hsock,crecvbuffer,1024,0); /接受消息 /rece=receiveif(num = 0)crecvbuffernum=0;sprintf(cshowbuffer,to me : %sn,crecvbuffer);printf(%s,cshowbuffer);/記錄消息fwrite(cshowbuffer ,sizeof(char),strlen(cshowbuffer),ioutfileserver); /ioutfileserverfflush(ioutfileserver);if(strcmp
8、(exit,crecvbuffer)=0)exitsystem();return 0; / 結(jié)束線(xiàn)程void createserver()socket m_sockserver;struct sockaddr_in serveraddr; /本地地址信息struct sockaddr_in serveraddrfrom; /連接的地址信息int iport=4600; /設(shè)定為固定端口int ibindresult=-1; /綁定結(jié)果int iwhilecount=200;struct hostent* localhost;char* localip;socket m_server;char
9、cwelcombuffer=welcome to you!0;int len=sizeof(struct sockaddr);int iwhilelistencount=10;dword nthreadid = 0;int ires; /發(fā)送的返回值char csendbuffer1024; /發(fā)送消息緩存char cshowbuffer1024; /接收消息緩存ioutfileserver= fopen(messageserver.txt,a); /打開(kāi)記錄消息的文件m_sockserver = socket ( af_inet,sock_stream, 0);printf(本機(jī)綁定的端口號(hào)
10、(大于1024):);scanf(%d,&iport);localhost = gethostbyname();localip = inet_ntoa (*(struct in_addr *)*localhost-h_addr_list);/設(shè)置網(wǎng)絡(luò)地址信息serveraddr.sin_family = af_inet;serveraddr.sin_port = htons(iport); /端口serveraddr.sin_addr.s_un.s_addr = inet_addr(localip);/地址/綁定地址信息ibindresult=bind(m_sockserver,(struct
11、 sockaddr*)&serveraddr,sizeof(struct sockaddr);/如果端口不能被綁定,重新設(shè)置端口while(ibindresult!=0 & iwhilecount 0)printf(綁定失敗,重新輸入:);scanf(%d,iport);/設(shè)置網(wǎng)絡(luò)地址信息serveraddr.sin_family = af_inet;serveraddr.sin_port = htons(iport); /端口serveraddr.sin_addr.s_un.s_addr = inet_addr(localip);/ip/綁定地址信息ibindresult = bind(m_
12、sockserver,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr);iwhilecount-;if(iwhilecount0)printf(start listenn);listen(m_sockserver,0); /返回值判斷單個(gè)監(jiān)聽(tīng)是否超時(shí)m_server=accept(m_sockserver,(struct sockaddr*)&serveraddrfrom,&len);if(m_server!=invalid_socket)/有連接成功,發(fā)送歡迎信息send(m_server,cwelcombuffer,sizeof(c
13、welcombuffer),0);/啟動(dòng)接收消息的線(xiàn)程createthread(null,0,threadproserver,(lpvoid)m_server,0,&nthreadid );break;printf(.);iwhilelistencount-;if(iwhilelistencount0) /輸入消息不能為空ires = send(m_server,csendbuffer,strlen(csendbuffer),0);/發(fā)送消息if(ires0)printf(發(fā)送失敗);elsesprintf(cshowbuffer,send to : %sn,csendbuffer);prin
14、tf(%s,cshowbuffer);fwrite(cshowbuffer ,sizeof(char),strlen(cshowbuffer),ioutfileserver);/將消息寫(xiě)入日志if(strcmp(exit,csendbuffer)=0)exitsystem();int checkip(char *cip)char ipaddress128; /ip地址字符串char ipnumber4; /ip地址中每組的數(shù)值int isubip=0; /ip地址中4段之一int idot=0; /ip地址中.的個(gè)數(shù)int iresult=0;int iipresult=1;int i; /循
15、環(huán)控制變量memset(ipnumber,0,4);strncpy(ipaddress,cip,128);for(i=0;i255)iipresult = 0;memset(ipnumber,0,4);elseipnumberisubip+=ipaddressi;if(idot=3 & iipresult!=0)iresult= 1;return iresult;/函數(shù)creatclient負(fù)責(zé)創(chuàng)建點(diǎn)對(duì)點(diǎn)的客戶(hù)端模塊,客戶(hù)端需要用戶(hù)數(shù)據(jù)服務(wù)的ip地址,與服務(wù)端建立連接后簡(jiǎn)歷接收消息的線(xiàn)程,同時(shí)啟動(dòng)發(fā)送消息的循環(huán)void createclient()socket m_sockclient;str
16、uct sockaddr_in clientaddr;char cserverip128;int iwhileip=10; /循環(huán)次數(shù)int icnnres; /連接結(jié)果dword nthreadid = 0; /線(xiàn)程id值char csendbuffer1024; /發(fā)送緩存char cshowbuffer1024; /顯示緩存char crecvbuffer1024; /接收緩存int num; /接收的字符個(gè)數(shù)int ires; /發(fā)送消息的結(jié)果int iipres; /檢測(cè)ip是否正確m_sockclient = socket ( af_inet,sock_stream, 0 );pr
17、intf(請(qǐng)輸入服務(wù)器地址:);scanf(%s,cserverip);/ip地址判斷if(strlen(cserverip)=0)strcpy(cserverip,127.0.0.1); /沒(méi)有輸入地址,使用回環(huán)地址elseiipres=checkip(cserverip);while(!iipres & iwhileip0)printf(請(qǐng)重新輸入服務(wù)器地址:n);scanf(%s,cserverip); /重新輸入ip地址iipres=checkip(cserverip); /檢測(cè)ip的合法性iwhileip-; /如果輸入次數(shù)過(guò)多,即多于本函數(shù)段開(kāi)頭iwhileip定義的次數(shù),則此線(xiàn)程
18、結(jié)束if(iwhileip 0 )printf(receive from server : %sn,crecvbuffer); /輸出接收到的緩存信息crecevbuffer/啟動(dòng)接收消息的線(xiàn)程createthread(null,0,threadproclient,(lpvoid)m_sockclient,0,&nthreadid );while(1)memset(csendbuffer,0,1024);scanf(%s,csendbuffer);if(strlen(csendbuffer)0) /輸入信息不能為空ires=send(m_sockclient,csendbuffer,strle
19、n(csendbuffer),0);if(ires=0) /發(fā)送消息不能為空p = (struct creceivepackage*)crecvbuffer;switch(p-itype)case clientsend_tran: /對(duì)消息進(jìn)行中轉(zhuǎn) clientsend_tranlatesfor(m=0;mitoid)/組包stmp=usrinfom.susersocket;memset(&sp,0,sizeof(sp);sp.itype=serversend_showmsg;strcpy(sp.cbuffer,p-cbuffer);ires = send(stmp,(char*)&sp,si
20、zeof(sp),0); /發(fā)送內(nèi)容if(ires0)printf(發(fā)送失敗n);break;case clientsend_list: /發(fā)送在線(xiàn)用戶(hù)memset(&sp,0,sizeof(sp);for(j=0;jifromid & usrinfoj.id!=0)sp.cbufferj=usrinfoj.id;sp.itype=serversend_online;send(hsock,(char*)&sp,sizeof(sp),0);break;case clientsend_exit:printf(退出系統(tǒng)n);return 0; /結(jié)束線(xiàn)程break;return 0;/函數(shù)notyi
21、fyuproc式服務(wù)器通知所有客戶(hù)端有新用戶(hù)登錄的線(xiàn)程dword winapi notyifyproc(lpvoid pparam) /ipvoidstruct csendpackage sp; /發(fā)送包socket stemp; /連接用戶(hù)的socket句柄int *p; /接收主線(xiàn)程發(fā)送過(guò)來(lái)的id值int j; /循環(huán)控制變量p=(int*)pparam; /新用戶(hù)idfor(j=0;jh_addr_list);/獲取本地ipserveraddr.sin_family = af_inet;serveraddr.sin_port = htons(4600); /設(shè)置綁定的端口號(hào)servera
22、ddr.sin_addr.s_un.s_addr = inet_addr(localip); /設(shè)置本地ip/創(chuàng)建套接字m_sockserver = socket ( af_inet,sock_stream, 0);if(m_sockserver = invalid_socket) /inualid_socketprintf(建立套接字失敗n);exit(0);/綁定本地ip地址ires=bind(m_sockserver,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr);if(ires 0)printf(建立套接字失敗n);exit(
23、0);/程序主循環(huán)while(1)listen(m_sockserver,0); /開(kāi)始監(jiān)聽(tīng)m_server=accept(m_sockserver,(struct sockaddr*)&serveraddrfrom,&len);/接收連接if(m_server!=invalid_socket)printf(有新用戶(hù)登陸); /對(duì)方已登陸if(iconnect 0)createthread(null,0,notyifyproc,(lpvoid)&id,0,&nthreadid );iconnect+;elsesend(m_server,cwarnbuffer,sizeof(cwarnbuffe
24、r),0); /已超出最大連接數(shù)wsacleanup();dword winapi threadtranclient(lpvoid pparam)socket hsock=(socket)pparam;int i; /循環(huán)控制變量char crecvbuffer2048; /接收消息的緩存intnum; /接收消息的字符數(shù)/char ctmp2; /臨時(shí)存放在線(xiàn)用戶(hù)idstruct creceivepackage sp; /服務(wù)端的接收包是,客戶(hù)端的發(fā)送包struct csendpackage *p; /服務(wù)端的發(fā)送包是,客戶(hù)端的接收包int itemp; /臨時(shí)存放接收到的id值while(
25、1)num = recv(hsock,crecvbuffer,2048,0);/接收消息if(num=0)p = (struct csendpackage*)crecvbuffer;if(p-itype=serversend_selfid)imyself=atoi(p-cbuffer);sp.itype=clientsend_list; /請(qǐng)求在線(xiàn)人員列表send(hsock,(char*)&sp,sizeof(sp),0);if(p-itype=serversend_newusr) /登陸用戶(hù)iditemp = atoi(p-cbuffer);usrinew+.id=itemp; /inew
26、表示有多少個(gè)新用戶(hù)登陸printf(有新用戶(hù)登錄,可以與其聊天n);bsend=1; /可以發(fā)送消息聊天if(p-itype=serversend_showmsg) /顯示接受的消息printf(rec:%sn,p-cbuffer);if(p-itype=serversend_online) /獲取在線(xiàn)列表for(i=0;icbufferi!=imyself & p-cbufferi!=0)usrinew+.id=p-cbufferi;printf(有用戶(hù)在線(xiàn),可以與其聊天n);bsend=1;/可以發(fā)送消息聊天if(!bsend)printf(在線(xiàn)列表為空n);return 0;void e
27、xittransystem()wsacleanup();exit(0);void createtranclient()socket m_sockclient; /建立連接的socketstruct sockaddr_in clientaddr; /目標(biāo)的地址信息int ires;/函數(shù)執(zhí)行情況char csendbuffer1024; /發(fā)送消息的緩存dword nthreadid = 0; /保存線(xiàn)程的id值struct creceivepackage sp; /發(fā)包結(jié)構(gòu)char ipbuffer128;printf(輸入服務(wù)器ip地址n);scanf(%s,ipbuffer);clientaddr.sin_family = af_inet;clientaddr.sin_port = htons(4600); /連接的端口號(hào)clientaddr.sin_addr.s_un.s_addr = inet_addr(ipbuffer);m_sockclient = socket
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術(shù)展覽設(shè)計(jì)師的空間布局與藝術(shù)呈現(xiàn)
- 年產(chǎn)100萬(wàn)套轉(zhuǎn)椅配件及15萬(wàn)套成品生產(chǎn)線(xiàn)項(xiàng)目可行性研究報(bào)告模板-立項(xiàng)拿地
- 2025年全球及中國(guó)自鎖平頭螺母行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球自由式風(fēng)帆板行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球鈣鈦礦太陽(yáng)光模擬器行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球生命科學(xué)服務(wù)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球無(wú)人機(jī)測(cè)繪系統(tǒng)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)碳捕獲與利用技術(shù)行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球汽車(chē)空調(diào)電機(jī)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)家用前置過(guò)濾器行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 二零二五版電力設(shè)施維修保養(yǎng)合同協(xié)議3篇
- 最經(jīng)典凈水廠施工組織設(shè)計(jì)
- VDA6.3過(guò)程審核報(bào)告
- 2024-2030年中國(guó)并購(gòu)基金行業(yè)發(fā)展前景預(yù)測(cè)及投資策略研究報(bào)告
- 2024年湖南商務(wù)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)帶答案
- 骨科手術(shù)中常被忽略的操作課件
- 《湖南師范大學(xué)》課件
- 2024年全國(guó)各地中考試題分類(lèi)匯編:作文題目
- 2024年高壓電工操作證考試復(fù)習(xí)題庫(kù)及答案(共三套)
- 《糖拌西紅柿 》 教案()
- 彈性力學(xué)數(shù)值方法:解析法:彈性力學(xué)中的變分原理
評(píng)論
0/150
提交評(píng)論