




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、tcp/ip 協(xié) 議 編 程 大 作 業(yè)課題名稱基于 tcp的網(wǎng)絡(luò)通信專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)班級(jí)計(jì)算機(jī) 1206 學(xué)號(hào)1030412612 學(xué)生姓名王 成 義物聯(lián)網(wǎng)工程學(xué)院摘要此 tcp/ip 課程設(shè)計(jì)實(shí)現(xiàn)了基于tcp的客戶 / 服務(wù)器通信程序, 具體實(shí)驗(yàn)過程通過有連接服務(wù)為主體,無連接服務(wù)為輔并利用事件對象i/o 管理來實(shí)現(xiàn)。客戶機(jī)具有注冊,登陸,單聊,私聊,在線人數(shù)列表,退出等功能。目錄一、總體設(shè)計(jì) . 4 1、基本通信協(xié)議選取. 4 2、通信過程設(shè)計(jì). 4 3、通信過程數(shù)據(jù)包設(shè)計(jì). 4 4、 程序流程圖 . 5 二、客戶端程序 . 6 1、功能: . 6 2、原理: . 6 3、程序清單
2、. 6 三、服務(wù)器端程序. 19 1、功能: . 19 2、原理: . 19 3、程序清單:. 19 四、運(yùn)行結(jié)果 . 35 1、 服務(wù)器端截圖. 35 2、客戶端截圖. 37 一、總體設(shè)計(jì)1、基本通信協(xié)議選取tcp (transmission control protocol)和 udp(user datagram protocol)協(xié)議屬于傳輸層協(xié)議。 tcp提供 ip 環(huán)境下的數(shù)據(jù)可靠傳輸, 它提供的服務(wù)包括數(shù)據(jù)流傳送、 可靠性、有效流控、全雙工操作和多路復(fù)用。 通過面向連接、端到端和可靠的數(shù)據(jù)包發(fā)送。而udp則不為 ip 提供可靠性、流控或差錯(cuò)恢復(fù)功能。 tcp對應(yīng)的是可靠性要求高的應(yīng)
3、用,而udp對應(yīng)的則是可靠性要求低、傳輸經(jīng)濟(jì)的應(yīng)用。本次實(shí)驗(yàn)基于 tcp/ip 協(xié)議利用事件對象i/o 管理實(shí)現(xiàn)基本的聊天功能,包括注冊,登錄,群聊,私聊及在線人數(shù)統(tǒng)計(jì)。2、通信過程設(shè)計(jì)2.1 客戶端設(shè)計(jì)a. 本地服務(wù)器主要功能:1)接收遠(yuǎn)程服務(wù)器轉(zhuǎn)發(fā)的消息并顯示消息。b. 本地客戶端主要功能:1)發(fā)送建立 tcp連接的請求操作;2)發(fā)送注冊信息,登陸消息及退出請求;3)發(fā)送群聊消息,私聊消息,在線人數(shù)統(tǒng)計(jì)及退出請求。2.2 服務(wù)器端設(shè)計(jì)a. 遠(yuǎn)程服務(wù)端主要功能:1)監(jiān)聽客戶端的連接請求;2)提供注冊服務(wù),驗(yàn)證登陸請求和驗(yàn)證功能;3)查看在線人數(shù),發(fā)送在線狀態(tài);4)發(fā)送群聊消息及私聊消息。3、
4、通信過程數(shù)據(jù)包設(shè)計(jì)3.1 客戶端數(shù)據(jù)包設(shè)計(jì):a. 注冊:0user( 用戶名 ) password(密碼) b. 登陸:1user( 用戶名 ) password(密碼) c. 聊天:0)群聊:2user( 用戶名 ) str( 內(nèi)容) 1)單聊:5str1( 單聊對象名 ) user( 用戶名 ) * str( 內(nèi)容) 2)在線用戶4user( 用戶名 ) str( 內(nèi)容) 3)退出(登錄):3user( 用戶名 ) 3.2 服務(wù)端數(shù)據(jù)包設(shè)計(jì):a. 注冊應(yīng)答:00注冊成功01注冊失敗用戶名已存在b. 登陸應(yīng)答:c. 聊天:1)單聊:61單聊對象不在線50單聊對象在線60單聊對象不存在2)群聊
5、:30廣播消息31非正確用戶的消息,不廣播3)在線人數(shù):40顯示當(dāng)前在線人數(shù)并發(fā)給查詢客戶4、程序流程圖10登陸成功12用戶名不存在11密碼不正確1 該用戶已登陸二、客戶端程序1、功能:1.1 注冊:向服務(wù)器發(fā)送注冊信息。然后接收服務(wù)器返回的應(yīng)答信息。1.2 登陸:向服務(wù)器發(fā)送登陸信息。接收服務(wù)器返回的應(yīng)答信息。1.3 聊天:登陸成功后 , 選擇群聊或單聊進(jìn)行聊天,選擇在線用戶可進(jìn)行查詢當(dāng)前在線用戶,選擇退出可退出登錄。a. 單聊:從在線用戶中選擇一個(gè),與其單聊b. 群聊:向所有在線的用戶發(fā)送消息c. 退出聊天:退出此次聊天,但不斷開連接d. 退出登陸,斷開連接,退出時(shí)不需要發(fā)送下線信息,直接
6、退出1.4 面向連接的客戶 / 服務(wù)器程序工作模型:2、原理:客戶機(jī)在注冊或登陸時(shí)首先和服務(wù)器連接,注冊完或登陸失敗斷開連接,登陸成功不斷開連接,使用send 和 recv 發(fā)送接收數(shù)據(jù),根據(jù)上述的數(shù)據(jù)報(bào)的定義,發(fā)送相應(yīng)的數(shù)據(jù)報(bào)。3、程序清單3.1 客戶端接收器(本地服務(wù)器)代碼#include #include #include #include #pragma comment(lib,ws2_32.lib) #define default_port 5051/for recv #define buffer_length 1000 void mysendmessage(socket ssoc
7、ket,char *response,int responselen, struct sockaddr* cli,int clilen); void main() int iport=default_port; wsadata wsadata; socket ssocket,wchyssocket; int ilen,wchyilen; int isend; int irecv; char send_buf1000; char recv_bufbuffer_length; struct sockaddr_in ser,cli,wchy; printf(-n); printf(cserver w
8、aitingn); printf(-n); if(wsastartup(makeword(2,2),&wsadata)!=0) printf(failed to load winsock.n);return; ssocket=socket(af_inet,sock_dgram,0); if(ssocket=invalid_socket)printf(socket()faild:%dn,wsagetlasterror();return; ser.sin_family=af_inet; ser.sin_port=htons(iport); ser.sin_addr.s_addr=htonl
9、(inaddr_any); if(bind(ssocket,(lpsockaddr)&ser,sizeof(ser)=socket_error) printf(bind()faild:%dn,wsagetlasterror();return; ilen=sizeof(cli); memset(recv_buf,0,sizeof(recv_buf); while(1) / 接收數(shù)據(jù)包確定 cli 表示 cli存有客戶端發(fā)來的 ip和 port irecv=recvfrom(ssocket,recv_buf,buffer_length,0,(sockaddr*)&cli,&
10、ilen); if(irecv=socket_error) printf(recvfrom()faild:%dn,wsagetlasterror();return; else if(irecv=0) break; else / 接收到了正確數(shù)據(jù)/printf(+%sn,recv_buf); / 控制信息的種類有00 01 10 11 12 20 21 30 31 /00注冊成功 01 注冊失敗 10 登陸成功 11.12表示登陸失敗 20表示一次成功會(huì)話 21 表示錯(cuò)誤會(huì)話 30 表示成功推出 31表示錯(cuò)誤推出switch(recv_buf0) case 0: if(recv_buf1=0)p
11、rintf(注冊成功 n); else printf(注冊失敗 n); break; case 1: if(recv_buf1=0) printf(登陸成功 n); wchy.sin_family=af_inet; wchy.sin_port=htons(5053); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();retur
12、n; wchyilen=sizeof(wchy); strcpy(send_buf,#); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen); else if(recv_buf1=) printf(已經(jīng)在其他地方登陸n); wchy.sin_family=af_inet; wchy.sin_port=htons(5053); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,s
13、ock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,*); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen); else printf(登陸失敗 n); wchy.sin_family=af_inet; wchy.sin_port=htons(505
14、3); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyil
15、en); break; case 2: printf(群聊%sn,recv_buf+2); break; case 4: printf(在線用戶列表: %sn,recv_buf+2); break; case 5: printf(單聊); wchy.sin_family=af_inet; wchy.sin_port=htons(5053); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socke
16、t()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,%); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen); printf(%sn,recv_buf+2); break; case 6: if(recv_buf1=0) printf(單聊對象不存在 n); wchy.sin_family=af_inet; wchy.sin_port=htons(5053);
17、wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen);
18、 else if(recv_buf1=1) printf(單聊對象未在線 n); wchy.sin_family=af_inet; wchy.sin_port=htons(5053); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,
19、&); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen); break; closesocket(ssocket); wsacleanup(); void mysendmessage(socket ssocket,char *response,int responselen, struct sockaddr* cli,int clilen) int isend; /int sendto ( socket s , const void * msg, int l
20、en, unsigned int flags, const struct sockaddr * to , int tolen ) ; isend=sendto(ssocket,response,responselen,0,(sockaddr*)cli,clilen); / isend=sendto(sclient,send_buf,sizeof(send_buf),0,(struct sockaddr*)&ser,ilen); if(isend=socket_error) printf(sendto()failed.:%dn,wsagetlasterror(); else if(ise
21、nd=0) ; else /printf(sendto() succeeded !n); /printf(-n); 3.1 客戶端代碼#include #include #include #pragma comment(lib, ws2_32.lib) #define buffer_size 1024 void mysendmessage(socket ssocket,char *response,int responselen); int main(int argc, char *argv) wsadata wsadata; sockaddr_in ser,cli; socket sclie
22、nt,wchysclient; int ilen,wchyilen; int irecv; char send_buf1000; char recv_bufbuffer_size; if (wsastartup(makeword(2, 2), &wsadata) != 0) printf(wsastartup()n); return 0; printf( 手動(dòng)連接模式中.n); char szserver256; / 連接的服務(wù)器地址,ip地址printf( 請輸入即將連接的服務(wù)器ip地址 :); gets(szserver); ser.sin_family = af_inet; se
23、r.sin_port = htons(5050); ser.sin_addr.s_addr = inet_addr(szserver); char user20,password20; char str100,str1100,wchystr100; bool haslogin=false; / 只能綁定一次,開始放在了循環(huán)里,555 wchysclient=socket(af_inet,sock_dgram,0); if(wchysclient=invalid_socket)printf(socket()faild:%dn,wsagetlasterror();return 0; cli.sin
24、_family=af_inet; cli.sin_port=htons(5053); cli.sin_addr.s_addr=htonl(inaddr_any); if(bind(wchysclient,(lpsockaddr)&cli,sizeof(cli)=socket_error) printf(bind()faild:%dn,wsagetlasterror();return 0; wchyilen=sizeof(cli); memset(recv_buf,0,sizeof(recv_buf); sclient = socket(af_inet, sock_stream, 0);
25、 if (sclient = invalid_socket) printf(socket()n); return 0; if (connect(sclient, (sockaddr*)&ser, sizeof(ser) = invalid_socket) printf(socket()n); return 0; else bool haslogin=false; while(!haslogin) printf(-n); printf(0. 注冊 n); printf(1. 登陸 n); printf(2. 退出 n); printf( 請輸入相應(yīng)的數(shù)字:n); scanf(%s,&am
26、p;str); switch(str0) case 0: printf( 用戶名: ); scanf(%s,user); printf( 密碼: ); scanf(%s,password); strcpy(send_buf,0); strcat(send_buf,user); strcat(send_buf,); strcat(send_buf,password); mysendmessage(sclient, send_buf, sizeof(send_buf); break; case 1: printf( 用戶名: ); scanf(%s,user); printf( 密碼:); sca
27、nf(%s,password); strcpy(send_buf,1); strcat(send_buf,user); strcat(send_buf,); strcat(send_buf,password); mysendmessage(sclient, send_buf, sizeof(send_buf); irecv=recvfrom(wchysclient,recv_buf,buffer_size,0,(sockaddr*)&cli,&wchyilen); if(irecv=socket_error) printf(recvfrom()faild:%dn,wsagetl
28、asterror();return 0; else if(irecv=0) break; else / 接收到了正確數(shù)據(jù)printf(recv:%sn,recv_buf); if(recv_buf0=&recv_buf1=) haslogin=0; system(cls); printf( 登錄失敗!請重新登錄或注冊后登錄_n); if(recv_buf0=*&recv_buf1=*) haslogin=0; system(cls); printf( 已經(jīng)在其他地方登陸n); printf( 登錄失?。≌堉匦逻x擇用戶登錄或注冊后登錄_n); if(recv_buf0=#&
29、;recv_buf1=#) haslogin=1; system(cls); printf( 登錄成功 _n); bool wchyhaslogin=false; while(!wchyhaslogin) printf(-n); printf(0. 群聊 n); printf(1. 單聊 n); printf(2. 在線用戶 n); printf(3. 退出 n); printf( 請輸入相應(yīng)的數(shù)字:n); scanf(%s,&wchystr); switch(wchystr0) case 0: wchyhaslogin=1; printf( 輸入 exit 退出。 n); print
30、f(-n); while(wchyhaslogin) printf(); scanf(%s,&str); if(strcmp(str,exit)!=0) strcpy(send_buf,2); strcat(send_buf,user); strcat(send_buf,); strcat(send_buf,str); mysendmessage(sclient, send_buf, sizeof(send_buf); else system(cls); wchyhaslogin=0; break; case 1: wchyhaslogin=1; printf( 請輸入單聊對象的用戶名
31、:); scanf(%s,&str1); strcpy(send_buf,5); strcat(send_buf,str1); strcat(send_buf,); strcat(send_buf,user); strcat(send_buf,*); strcat(send_buf,_welcome_to_single_chat.); mysendmessage(sclient, send_buf, sizeof(send_buf); irecv=recvfrom(wchysclient,recv_buf,buffer_size,0,(sockaddr*)&cli,&w
32、chyilen); if(irecv=socket_error) printf(recvfrom()faild:%dn,wsagetlasterror();return 0; else if(irecv=0) break; else / 接收到了正確數(shù)據(jù)/printf(recv:%sn,recv_buf); if(recv_buf0=&recv_buf1=) wchyhaslogin=0; system(cls); printf( 單聊對象不存在,退出了單聊模式n); if(recv_buf0=&recv_buf1=&) wchyhaslogin=0; system(c
33、ls); printf( 單聊對象未在線,退出了單聊模式n); if(recv_buf0=%&recv_buf1=%) printf( 輸入 exit 退出。 n); printf(-n); while(wchyhaslogin) printf(); scanf(%s,&str); if(strcmp(str,exit)!=0) strcpy(send_buf,5); strcat(send_buf,str1); strcat(send_buf,); strcat(send_buf,user); strcat(send_buf,*); strcat(send_buf,str);
34、 mysendmessage(sclient, send_buf, sizeof(send_buf); else system(cls); wchyhaslogin=0; break; case 2: strcpy(send_buf,4); strcat(send_buf,user); strcat(send_buf,); strcat(send_buf,str); mysendmessage(sclient, send_buf, sizeof(send_buf); system(cls); break; case 3: strcpy(send_buf,3); strcat(send_buf,
35、user); strcat(send_buf,); mysendmessage(sclient, send_buf, sizeof(send_buf); haslogin=0; wchyhaslogin=1; system(cls); break; default: system(cls); printf( 請輸入正確信息n); break; break; case 2: exit(0); break; default: system(cls); printf( 請輸入正確信息); system(pause); closesocket(sclient); wsacleanup(); retur
36、n 0; void mysendmessage(socket ssocket,char *response,int responselen) int isend; isend=send(ssocket,response,responselen,0); if(isend=socket_error) printf(send()failed.:%dn,wsagetlasterror(); else if(isend=0) ; else /printf(send() succeeded !n); printf(-n); 三、服務(wù)器端程序1、功能:1.1 接收客戶機(jī)發(fā)來的注冊信息,給客戶注冊。其中注冊的
37、信息記錄在當(dāng)前文件夾下的config.txt中,注冊時(shí),檢查用戶名是否已存在。如果注冊信息合格,那么將用戶名和密碼記錄在文件中。向客戶機(jī)發(fā)送注冊結(jié)果。1.2 接收客戶機(jī)發(fā)來的登陸信息。獲取用戶名和密碼,在文件中查找用戶名和密碼是否合法。如果合法,開始聊天。否則,返回錯(cuò)誤信息。用戶登陸成功后,選擇群聊或單聊進(jìn)行聊天,選擇在線用戶可進(jìn)行查詢當(dāng)前在線用戶,選擇退出可退出登錄。1.3 接收客戶機(jī)發(fā)來的聊天信息。將聊天信息轉(zhuǎn)發(fā)給所有在線的ip 。其中聊天信息有兩類:a)單聊:客戶機(jī)指定在線用戶中的一個(gè)用戶名,與其進(jìn)行聊天。b)群聊:客戶機(jī)向所有在線的用戶發(fā)送消息。1.4 面向連接的客戶 / 服務(wù)器程序工
38、作模型:2、原理:服務(wù)器使用事件對象i/o 模式,監(jiān)聽套接口開啟監(jiān)聽,創(chuàng)建事件,注冊接收連接事件和關(guān)閉套接口事件。發(fā)生接收連接事件后,創(chuàng)建新事件,注冊讀事件和關(guān)閉套接口事件, 保存響應(yīng)的套接字, 客戶機(jī)的 ip ,是否登陸等必要信息。3、程序清單:3.1 頭文件/deal.h int finduser(userdata *data,int num,char *name) int i; for(i=0;iusername)=0) return i; return -1; void deal(char *str,userdata *data,int &num,char *response,
39、char *ip) char userusernamelen; char passpasswordlen; / 第一位字符是功能號(hào)/ 0 注冊/ 1 登陸/ 2 會(huì)話/ 3 退出int i,t; if(str0=0) / 注冊的消息格式為 0+name+password for(i=1;iusername,user); strcpy(datanum-password,pass); datanum-log=0; memset(datanum-ip,0,sizeof(datanum-ip); printf(%s 用戶注冊成功 n,user); /-注冊完成/ 返回成功信息strcpy(respon
40、se,00);/第一位是功能號(hào)第二位是狀態(tài)號(hào) 0表示成功 1 表示失敗savedata(data,num); else /fail printf(%s 用戶注冊失敗 n,user); /-注冊失敗strcpy(response,01); else if(str0=1) / 登陸的消息格式為 1+name+password for(i=1;ipassword); if(strcmp(pass,datat-password)=0 & datat-log=0) / 密碼驗(yàn)證成功printf(%s 登陸成功 n,user); datat-log=1; strcpy(datat-ip,ip);
41、strcpy(response,10); else if(strcmp(pass,datat-password)=0 & datat-log=1) printf(%s 已經(jīng)在其他地方登陸 n,user); strcpy(response,1); else printf(%s 登陸密碼錯(cuò)誤 n,user); strcpy(response,11); else printf(%s 用戶不存在,登陸失敗n,user); strcpy(response,12); else if(str0=2) / 會(huì)話的消息格式為 2+name+(message) for(i=1;iusername,user
42、)=0 & strcmp(datat-ip,ip)=0) / 表示確實(shí)是正確用戶發(fā)來的會(huì)話strcpy(response,20); strcat(response,user); strcat(response,:); strcat(response,str+i+1); printf(%s:%sn,user,str+i+1); else strcpy(response,21); printf(非正確用戶發(fā)來會(huì)話,不予處理!n); else if(str0=3) / 會(huì)話的消息格式為 3+name+(message) for(i=1;iusername,user)=0 & strc
43、mp(datat-ip,ip)=0) / 表示確實(shí)是正確用戶發(fā)來的會(huì)話strcpy(response,30); datat-log=0; memset(datat-ip,0,sizeof(datat-ip); printf(%s 退出n,datat-username); else strcpy(response,31); printf(非正確用戶發(fā)來會(huì)話,不予處理!); else if(str0=4) for(i=1;istrlen(str);i+) if(stri=) break; stri=0; strcpy(response,40); for(i=0;ilog=1) printf(%s%
44、s在線 n,datai-username,datai-ip); /printf(%sn,datai-username); strcat(response,datai-username); strcat(response, ); else /printf(%s,datai-ip); else if(str0=5) for(i=1;istrlen(str);i+) if(stri=) break; stri=0; strcpy(user,str+1); printf(%s 用戶接收 n,user); strcpy(pass,str+i+1); for(i=1;ilog=0) strcpy(resp
45、onse,61); printf(%s 未在線 n,user); else if(datat-log=1) strcpy(response,50); strcat(response,pass); strcat(response,:); strcat(response,pass+i+1); printf(%s:%sn,pass,pass+i+1); printf(%s 在線,可進(jìn)行聊天 n,user); void mysendmessage(int ssocket,char *response,int responselen,sockaddr* cli,int clilen) int isend
46、; isend=sendto(ssocket,response,responselen,0,(sockaddr*)cli,clilen); if(isend=socket_error) printf(sendto()failed.:%dn,wsagetlasterror(); else if(isend=0) ; else /printf(sendto() succeeded !n); /printf(-n); /init.h #include #include /for main.cpp(1.cpp) #define default_port 5051/for recv #define de
47、fault_portsend 5052/for send #define buffer_length 1000 const bool debug=0; #define maxuser 1000 /-/ / 當(dāng)程序遇到異常而結(jié)束時(shí)會(huì)示出錯(cuò)誤而退出/-/ / 成員結(jié)構(gòu)信息#define usernamelen 200 #define passwordlen 200 typedef struct char username200; char password200; bool log;/是否登陸char ip20; userdata; /-/ #define thefile config.txt /
48、 初始化用戶數(shù)據(jù)導(dǎo)入bool initdata(userdata *s,int num,int &p)/成功返回 true 發(fā)生錯(cuò)誤返回false /-/ / 讀取文件信息并返回file *fp; char userbufusernamelen; char passbufpasswordlen; fp=fopen(thefile,r); if(!fp) if(debug) printf(config文件不存在 n); else if(debug) printf(find config.txtn); while(!feof(fp) /fgets(buf,sizeof(buf),fp);
49、fscanf(fp,%s,userbuf); fscanf(fp,%s,passbuf); if(debug) printf(+user:%s password:%sn,userbuf,passbuf); /add p+; sp=(userdata *)malloc(sizeof(userdata); if(!sp)printf(+error:malloc failed!n);return false; strcpy(sp-username,userbuf); strcpy(sp-password,passbuf); sp-log=0; memset(sp-ip,0,sizeof(sp-ip)
50、; fclose(fp); return true; bool savedata(userdata *userdata,int userdatap) file *fp; /建立配置文件fp=fopen(thefile,w); if(!fp)printf(+error:無法創(chuàng)建 config文件! );return false; int i; for(i=0;iusername,userdatai-password); if(i!=userdatap)fprintf(fp,n); fclose(fp); 3.2 服務(wù)器主函數(shù)#include #include #include #pragma c
51、omment(lib,ws2_32.lib) #includeinit.h #includedeal.h / userdata *userdatamaxuser; int userdatap=-1; #define buffer_size 2048 void compressarrays(wsaevent events, socket sockets, dword *total, int index) for (size_t i = index + 1; i wsa_maximum_wait_events) printf(too many connections); closesocket(a
52、ccept); break; newevent = wsacreateevent(); if (newevent = wsa_invalid_event) printf(wsacreateevent()n); break; wsaeventselect(accept, newevent, fd_read | fd_write | fd_close); eventarrayeventtotal = newevent; socketarrayeventtotal = accept; cliarrayeventtotal = cli; eventtotal+; printf(socket %d co
53、nnectedn, accept); / 一下處理 fd_read 通知if (networkevents.lnetworkevents & fd_read) if (networkevents.ierrorcodefd_read_bit != 0) wsacloseevent(eventarrayindex - wsa_wait_event_0); printf(fd_read failed with error %dn, networkevents.ierrorcodefd_read_bit); break; / 從套接口讀入數(shù)據(jù)int irecv = recv(socketarr
54、ayindex - wsa_wait_event_0, buffer, sizeof(buffer), 0); if (irecv = 0) break; else if (irecv = socket_error) printf(recv()n); break; else / 請求端 ip ser.sin_addr.s_addr=inet_addr(inet_ntoa(cliarrayindex - wsa_wait_event_0.sin_addr); printf(accepted client ip:%s,port:%dn, inet_ntoa(cliarrayindex - wsa_wait_event_0.sin_addr),ntohs(cliarrayindex - wsa_wait_event_0.sin_port); printf(recv:%sn,buffer); memset(response,0,sizeof(response); deal(buffer,userdata,userdatap,response,inet_ntoa(cliarrayindex - wsa_wait_event
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 住建部 epc合同范例
- 共享產(chǎn)權(quán)房合同范例
- 共同經(jīng)營協(xié)議合同范例
- 2025年甘露醇項(xiàng)目合作計(jì)劃書
- 腦梗死治療方案
- 小學(xué)生的科學(xué)探索
- 帶對象去旅游
- 燃?xì)庑袠I(yè)匯報(bào)
- 2015年初中畢業(yè)升學(xué)考試(湖南懷化卷)物理【含答案、解析】
- 肺癌根治術(shù)術(shù)后護(hù)理
- 2024年南信語文數(shù)學(xué)試卷(含答案)
- JGJ46-2024 建筑與市政工程施工現(xiàn)場臨時(shí)用電安全技術(shù)標(biāo)準(zhǔn)
- 2016-2023年江蘇電子信息職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年考點(diǎn)試題甄選合集含答案解析
- 8.6《林黛玉進(jìn)賈府》課本劇劇本
- 地理知識(shí)介紹課件
- 民航國內(nèi)航空匯編航路_3.1.8w系列航線
- 高數(shù)常微分方程-高階微分方程
- 竹里館ppt課件
- 【最新】中考?xì)v史專題復(fù)習(xí) 中外科技發(fā)展課件 新人教-新人教初中九年級(jí)全冊歷史課件
- 醫(yī)院卒中質(zhì)量控制考核方案
- 最新文字學(xué)試題(1)(共8頁)
評(píng)論
0/150
提交評(píng)論