基于c語言的簡易網(wǎng)絡(luò)通信軟件_第1頁
基于c語言的簡易網(wǎng)絡(luò)通信軟件_第2頁
基于c語言的簡易網(wǎng)絡(luò)通信軟件_第3頁
基于c語言的簡易網(wǎng)絡(luò)通信軟件_第4頁
基于c語言的簡易網(wǎng)絡(luò)通信軟件_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、#include #include #pragma comment (lib,ws2_32.lib)/客戶端發(fā)送給服務(wù)端的消息類型#define clientsend_exit 1#define clientsend_tran 2#define clientsend_list 3/服務(wù)端發(fā)送給客戶端的消息類型#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)體,客戶端使用這個結(jié)構(gòu)體發(fā)送數(shù)據(jù)struct creceivepackageint itype; /存放消息類型int itoid; /存放目標用戶idint ifromid; /存放原用戶idchar cbuffer1024; /存放消息內(nèi)容;/服務(wù)端發(fā)送消息的結(jié)構(gòu)體,服務(wù)端使用這個結(jié)構(gòu)體發(fā)送數(shù)據(jù)struct csendpackageint itype; /消息類型int icurconn; /當前在線用戶數(shù)量char cbuffer1024; /存放消息內(nèi)容;/服務(wù)端存儲在線用戶信息的結(jié)構(gòu)體struct cusersocketi

3、nfoint id; /用戶的idchar cdstip64; /用戶的ip地址,擴展使用int iport; /用戶應(yīng)用程序端口擴展使用socket susersocket; /網(wǎng)絡(luò)句柄;/客戶端存儲在線用戶列表的結(jié)構(gòu)體struct cuserint id; /用戶的idchar cdstip64; /用戶的ip地址 擴展時使用;struct cuser usr20; /客戶端存儲用戶信息的對象int bsend=0; /是否可以發(fā)送消息int imyself; /自己的idint inew=0; /在線用戶數(shù)struct cusersocketinfo usrinfo20; /服務(wù)端存儲用

4、戶信息的對象/函數(shù)exitsystem用于實現(xiàn)點對點方式的退出void exitsystem()if(ioutfileserver!=null)fclose(ioutfileserver);if(ioutfileclient!=null)fclose(ioutfileclient);wsacleanup();exit(0);/函數(shù)threadproclient是客戶端接收消息的線程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ū),文件以寫方式打開時將緩沖區(qū)內(nèi)容寫入文件,在頭文件stdio.h中,文件原型:int fflush(file*stream)if(strcmp(exit,crecvbuffer)=0)exitsystem();return 0; /結(jié)束線程/函數(shù)threadproserver是服務(wù)端接收消息的線程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é)束線程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); /打開記錄消息的文件m_sockserver = socket ( af_inet,sock_stream, 0);printf(本機綁定的端口號

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); /返回值判斷單個監(jiān)聽是否超時m_server=accept(m_sockserver,(struct sockaddr*)&serveraddrfrom,&len);if(m_server!=invalid_socket)/有連接成功,發(fā)送歡迎信息send(m_server,cwelcombuffer,sizeof(c

13、welcombuffer),0);/啟動接收消息的線程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);/將消息寫入日志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地址中.的個數(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負責創(chuàng)建點對點的客戶端模塊,客戶端需要用戶數(shù)據(jù)服務(wù)的ip地址,與服務(wù)端建立連接后簡歷接收消息的線程,同時啟動發(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; /線程id值char csendbuffer1024; /發(fā)送緩存char cshowbuffer1024; /顯示緩存char crecvbuffer1024; /接收緩存int num; /接收的字符個數(shù)int ires; /發(fā)送消息的結(jié)果int iipres; /檢測ip是否正確m_sockclient = socket ( af_inet,sock_stream, 0 );pr

17、intf(請輸入服務(wù)器地址:);scanf(%s,cserverip);/ip地址判斷if(strlen(cserverip)=0)strcpy(cserverip,127.0.0.1); /沒有輸入地址,使用回環(huán)地址elseiipres=checkip(cserverip);while(!iipres & iwhileip0)printf(請重新輸入服務(wù)器地址:n);scanf(%s,cserverip); /重新輸入ip地址iipres=checkip(cserverip); /檢測ip的合法性iwhileip-; /如果輸入次數(shù)過多,即多于本函數(shù)段開頭iwhileip定義的次數(shù),則此線程

18、結(jié)束if(iwhileip 0 )printf(receive from server : %sn,crecvbuffer); /輸出接收到的緩存信息crecevbuffer/啟動接收消息的線程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: /對消息進行中轉(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ā)送在線用戶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é)束線程break;return 0;/函數(shù)notyi

21、fyuproc式服務(wù)器通知所有客戶端有新用戶登錄的線程dword winapi notyifyproc(lpvoid pparam) /ipvoidstruct csendpackage sp; /發(fā)送包socket stemp; /連接用戶的socket句柄int *p; /接收主線程發(fā)送過來的id值int j; /循環(huán)控制變量p=(int*)pparam; /新用戶idfor(j=0;jh_addr_list);/獲取本地ipserveraddr.sin_family = af_inet;serveraddr.sin_port = htons(4600); /設(shè)置綁定的端口號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); /開始監(jiān)聽m_server=accept(m_sockserver,(struct sockaddr*)&serveraddrfrom,&len);/接收連接if(m_server!=invalid_socket)printf(有新用戶登陸); /對方已登陸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; /臨時存放在線用戶idstruct creceivepackage sp; /服務(wù)端的接收包是,客戶端的發(fā)送包struct csendpackage *p; /服務(wù)端的發(fā)送包是,客戶端的接收包int itemp; /臨時存放接收到的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; /請求在線人員列表send(hsock,(char*)&sp,sizeof(sp),0);if(p-itype=serversend_newusr) /登陸用戶iditemp = atoi(p-cbuffer);usrinew+.id=itemp; /inew

26、表示有多少個新用戶登陸printf(有新用戶登錄,可以與其聊天n);bsend=1; /可以發(fā)送消息聊天if(p-itype=serversend_showmsg) /顯示接受的消息printf(rec:%sn,p-cbuffer);if(p-itype=serversend_online) /獲取在線列表for(i=0;icbufferi!=imyself & p-cbufferi!=0)usrinew+.id=p-cbufferi;printf(有用戶在線,可以與其聊天n);bsend=1;/可以發(fā)送消息聊天if(!bsend)printf(在線列表為空n);return 0;void e

27、xittransystem()wsacleanup();exit(0);void createtranclient()socket m_sockclient; /建立連接的socketstruct sockaddr_in clientaddr; /目標的地址信息int ires;/函數(shù)執(zhí)行情況char csendbuffer1024; /發(fā)送消息的緩存dword nthreadid = 0; /保存線程的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); /連接的端口號clientaddr.sin_addr.s_un.s_addr = inet_addr(ipbuffer);m_sockclient = socket

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論