TCPIP大作業(yè)基于Socket的網(wǎng)絡(luò)通信_(tái)第1頁(yè)
TCPIP大作業(yè)基于Socket的網(wǎng)絡(luò)通信_(tái)第2頁(yè)
TCPIP大作業(yè)基于Socket的網(wǎng)絡(luò)通信_(tái)第3頁(yè)
TCPIP大作業(yè)基于Socket的網(wǎng)絡(luò)通信_(tái)第4頁(yè)
TCPIP大作業(yè)基于Socket的網(wǎng)絡(luò)通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

編號(hào)TCP/IP協(xié)議與網(wǎng)絡(luò)編程期末大作業(yè) 題目:基于Socket網(wǎng)絡(luò)通信物聯(lián)網(wǎng)工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)摘要課題是基于TCP/UDP協(xié)議編寫(xiě)聊天室系統(tǒng)。聊天室系統(tǒng)主要包含注冊(cè)、登陸、群聊、單聊、顯示在線人員和退出功效。系統(tǒng)主要包含客戶端、服務(wù)器端和客戶顯示端。其中客戶端與服務(wù)器端連接基于TCP協(xié)議,服務(wù)器端向客戶顯示端發(fā)送數(shù)據(jù)是基于UDP協(xié)議。課題是網(wǎng)絡(luò)協(xié)議棧中傳輸層應(yīng)用,在網(wǎng)絡(luò)成基礎(chǔ)上,在傳輸層中使用網(wǎng)絡(luò)套接字,達(dá)成數(shù)據(jù)傳送目標(biāo),從而實(shí)現(xiàn)聊天室系統(tǒng)功效。關(guān)鍵詞:TCP/UDP;聊天室;網(wǎng)絡(luò)套接字;數(shù)據(jù)傳送目錄第1章總體設(shè)計(jì) 2第2章客戶端設(shè)計(jì) 32.1發(fā)送端設(shè)計(jì) 32.11流程圖 32.12代碼 32.2接收端設(shè)計(jì) 32.21流程圖 32.22代碼 3第3章服務(wù)器設(shè)計(jì) 43.1流程圖 43.2代碼 4第4章運(yùn)行結(jié)果 5 第1章總體設(shè)計(jì)1原理1.1TCP在面向連接數(shù)據(jù)流(SOCK_STREAM)傳輸過(guò)程中,設(shè)計(jì)基于TCP/IP協(xié)議程序是傳輸層使用TCP協(xié)議,它最大特點(diǎn)是在通信之前要在客戶和服務(wù)器之間先建立連接,在數(shù)據(jù)傳輸完成后要關(guān)閉連接,釋放網(wǎng)絡(luò)資源。面向連接客戶/服務(wù)器程序工作模型以下:1.2UDP無(wú)連接數(shù)據(jù)報(bào)(SOCK_DGRAM)傳輸服務(wù)在傳輸層使用協(xié)議時(shí)UDP協(xié)議。與面向連接通信協(xié)議過(guò)程不一樣,它最大特點(diǎn)就是必須要在客戶和服務(wù)器之間建立連接,通信任何一方能夠先發(fā)送數(shù)據(jù),這么首先發(fā)送數(shù)據(jù)一方就成為客戶端,而接收數(shù)據(jù)一方就是服務(wù)器端。在數(shù)據(jù)傳輸完成后,只要關(guān)閉套接口,釋放網(wǎng)絡(luò)資源,通信過(guò)程就結(jié)束了。無(wú)連接數(shù)據(jù)包傳輸服務(wù)通信是,客戶端與服務(wù)器端所使用函數(shù)是類似。面向無(wú)連接客戶/服務(wù)器程序工作模型以下:1.3流程圖基于TCP/UDP聊天室系統(tǒng)包含客戶端、客戶顯示端和服務(wù)器端三部分。功效主要是注冊(cè)、登陸、群聊、單聊、顯示在線人員和退出。客戶端與服務(wù)器端連接協(xié)議基于TCP協(xié)議,服務(wù)器端發(fā)送功效基于UDP協(xié)議。客戶端與服務(wù)器端建立連接后,客戶端進(jìn)行操作,將數(shù)據(jù)發(fā)送至客戶顯示端。

第2章客戶端設(shè)計(jì)2.11流程圖2.12代碼#include<winsock2.h>#include<stdlib.h>#include<stdio.h>#pragmacomment(lib,"Ws2_32.lib")#defineBUFFER_SIZE1024voidMySendMessage(SOCKETsSocket,char*response,intresponseLen);intmain(intargc,char**argv){ WSADATAwsaData; sockaddr_inser,cli; SOCKETsClient,wchysClient; intiLen,wchyiLen; intiRecv; charsend_buf[1000]; charrecv_buf[BUFFER_SIZE]; if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("WSAStartup()\n"); return0; } printf("手動(dòng)連接模式中\(zhòng)n"); charszServer[256]; //連接服務(wù)器地址,IP地址 printf("請(qǐng)輸入即將連接服務(wù)器IP地址:"); gets(szServer); ser.sin_family=AF_INET; ser.sin_port=htons(5050); ser.sin_addr.s_addr=inet_addr(szServer); charuser[20],password[20]; charstr[100],str1[100],wchystr[100]; boolhasLogin=false; //只能綁定一次,開(kāi)始放在了循環(huán)里,555 wchysClient=socket(AF_INET,SOCK_DGRAM,0); if(wchysClient==INVALID_SOCKET){printf("socket()Faild:%d\n",WSAGetLastError());return0;} cli.sin_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:%d\n",WSAGetLastError());return0;} wchyiLen=sizeof(cli); memset(recv_buf,0,sizeof(recv_buf)); sClient=socket(AF_INET,SOCK_STREAM,0); if(sClient==INVALID_SOCKET) { printf("socket()\n"); return0; } if(connect(sClient,(sockaddr*)&ser,sizeof(ser))==INVALID_SOCKET) { printf("socket()\n"); return0; } else { boolhasLogin=false; while(!hasLogin){ printf("\n"); printf("0.注冊(cè)\n"); printf("1.登陸\n"); printf("2.退出\n"); printf("請(qǐng)輸入對(duì)應(yīng)數(shù)字:\n>"); scanf("%s",&str); switch(str[0]) { 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("密碼:"); scanf("%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:%d\n",WSAGetLastError());return0;} elseif(iRecv==0)break; else {//接收到了正確數(shù)據(jù) printf("recv:%s\n",recv_buf); } if(recv_buf[0]=='@'&&recv_buf[1]=='@'){ hasLogin=0; system("cls"); printf("登錄失?。≌?qǐng)重新登錄或注冊(cè)后登錄^_^\n"); } if(recv_buf[0]=='*'&&recv_buf[1]=='*'){ hasLogin=0; system("cls"); printf("已經(jīng)在其余地方登陸\n"); printf("登錄失??!請(qǐng)重新選擇用戶登錄或注冊(cè)后登錄^_^\n"); } if(recv_buf[0]=='#'&&recv_buf[1]=='#'){ hasLogin=1; system("cls"); printf("登錄成功^_^\n"); boolwchyhasLogin=false; while(!wchyhasLogin){ printf("\n"); printf("0.群聊\n"); printf("1.單聊\n"); printf("2.在線用戶\n"); printf("3.退出\n"); printf("請(qǐng)輸入對(duì)應(yīng)數(shù)字:\n>"); scanf("%s",&wchystr); switch(wchystr[0]) { case'0': wchyhasLogin=1; printf("輸入exit退出。\n"); printf("\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("請(qǐng)輸入單聊對(duì)象用戶名:"); 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,&wchyiLen); if(iRecv==SOCKET_ERROR) {printf("recvfrom()Faild:%d\n",WSAGetLastError());return0;} elseif(iRecv==0)break; else {//接收到了正確數(shù)據(jù) //printf("recv:%s\n",recv_buf); } if(recv_buf[0]=='^'&&recv_buf[1]=='^'){ wchyhasLogin=0; system("cls"); printf("單聊對(duì)象不存在,退出了單聊模式\n"); } if(recv_buf[0]=='&'&&recv_buf[1]=='&'){ wchyhasLogin=0; system("cls"); printf("單聊對(duì)象未在線,退出了單聊模式\n"); } if(recv_buf[0]=='%'&&recv_buf[1]=='%'){ 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); 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,user); strcat(send_buf,"@"); MySendMessage(sClient,send_buf,sizeof(send_buf)); hasLogin=0; wchyhasLogin=1; system("cls"); break; default: system("cls"); printf("請(qǐng)輸入正確信息\n"); break; } } } break; case'2': exit(0); break; default: system("cls"); printf("請(qǐng)輸入正確信息"); } } } system("PAUSE"); closesocket(sClient); WSACleanup(); return0;}voidMySendMessage(SOCKETsSocket,char*response,intresponseLen){ intiSend; iSend=send(sSocket,response,responseLen,0); if(iSend==SOCKET_ERROR) { printf("send()Failed.:%d\n",WSAGetLastError()); } elseif(iSend==0); else { //printf("send()succeeded!\n"); printf("\n"); }}

2.2接收端設(shè)計(jì)2.21流程圖2.22代碼#include<stdlib.h>#include<string.h>//formain.cpp(1.cpp)#defineDEFAULT_PORT5051//FORRECV#defineDEFAULT_PORTSEND5052//FORSEND#defineBUFFER_LENGTH1000constboolDebug=0;#defineMaxUser1000//////當(dāng)程序碰到異常而結(jié)束時(shí)會(huì)示犯錯(cuò)誤而退出//////組員結(jié)構(gòu)信息#defineUserNameLen200#definePasswordLen200typedefstruct{ charUserName[200]; charPassword[200]; boolLog;//是否登陸 charIp[20];}UserData;#definethefile"config.txt"boolSaveData(UserData**userdata,intuserdatap);//////初始化用戶數(shù)據(jù)導(dǎo)入intfindUser(UserData**data,intnum,char*name){ inti; for(i=0;i<=num;i++) { if(strcmp(name,data[i]->UserName)==0)returni; } return-1;}voiddeal(char*str,UserData**data,int&num,char*response,char*ip){ charUser[UserNameLen]; charPass[PasswordLen]; //第一位字符是功效號(hào) //0注冊(cè) //1登陸 //2會(huì)話 //3退出 inti,t; if(str[0]=='0') { //注冊(cè)消息格式為0+name+@+password for(i=1;i<strlen(str);i++) if(str[i]=='@')break; str[i]='\0'; strcpy(User,str+1); strcpy(Pass,str+i+1); t=findUser(data,num,User); if(t==-1) {//該用戶名不存在,能夠注冊(cè) num++; data[num]=(UserData*)malloc(sizeof(UserData)); if(data[num]==NULL){printf("[+]ERROR:mallocfailed\n");exit(1);} strcpy(data[num]->UserName,User); strcpy(data[num]->Password,Pass); data[num]->Log=0; memset(data[num]->Ip,'\0',sizeof(data[num]->Ip)); printf("%s用戶注冊(cè)成功\n",User); //注冊(cè)完成 //返回成功信息 strcpy(response,"00");//第一位是功效號(hào)第二位是狀態(tài)號(hào)0表示成功1表示失敗 SaveData(data,num); } else {//fail printf("%s用戶注冊(cè)失敗\n",User); //注冊(cè)失敗 strcpy(response,"01"); } } elseif(str[0]=='1') { //登陸消息格式為1+name+@+password for(i=1;i<strlen(str);i++) if(str[i]=='@')break; str[i]='\0'; //printf("i=%d\n",i); strcpy(User,str+1); strcpy(Pass,str+i+1); t=findUser(data,num,User); if(t!=-1) {//找到該用戶 //printf("Pass=%s",Pass); //printf("Pawd=%s",data[t]->Password); if(strcmp(Pass,data[t]->Password)==0&&data[t]->Log==0) {//密碼驗(yàn)證成功 printf("%s登陸成功\n",User); data[t]->Log=1; strcpy(data[t]->Ip,ip); strcpy(response,"10"); } elseif(strcmp(Pass,data[t]->Password)==0&&data[t]->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"); } } elseif(str[0]=='2') { //會(huì)話消息格式為2+'name'+'@'+'(message)' for(i=1;i<strlen(str);i++) if(str[i]=='@')break; str[i]='\0'; strcpy(User,str+1); t=findUser(data,num,User); if(t!=-1&&strcmp(data[t]->UserName,User)==0&&strcmp(data[t]->Ip,ip)==0) { //表示確實(shí)是正確用戶發(fā)來(lái)會(huì)話 strcpy(response,"20"); strcat(response,User); strcat(response,":"); strcat(response,str+i+1); printf("%s:%s\n",User,str+i+1); } else { strcpy(response,"21"); printf("非正確用戶發(fā)來(lái)會(huì)話,不予處理!\n"); } } elseif(str[0]=='3') { //會(huì)話消息格式為3+'name'+'@'+'(message)' for(i=1;i<strlen(str);i++) if(str[i]=='@')break; str[i]='\0'; strcpy(User,str+1); t=findUser(data,num,User); if(t!=-1&&strcmp(data[t]->UserName,User)==0&&strcmp(data[t]->Ip,ip)==0) { //表示確實(shí)是正確用戶發(fā)來(lái)會(huì)話 strcpy(response,"30"); data[t]->Log=0; memset(data[t]->Ip,'\0',sizeof(data[t]->Ip)); printf("%s退出\n",data[t]->UserName); } else { strcpy(response,"31"); printf("非正確用戶發(fā)來(lái)會(huì)話,不予處理!"); } } elseif(str[0]=='4') { for(i=1;i<strlen(str);i++) if(str[i]=='@') break; str[i]='\0'; strcpy(response,"40"); for(i=0;i<=num;i++) { if(data[i]->Log==1){ printf("%s[%s]在線\n",data[i]->UserName,data[i]->Ip); //printf("%s\n",data[i]->UserName); strcat(response,data[i]->UserName); strcat(response,""); } else{ //printf("%s",data[i]->Ip); } } } elseif(str[0]=='5') { for(i=1;i<strlen(str);i++) if(str[i]=='@') break; str[i]='\0'; strcpy(User,str+1); printf("%s用戶接收\(chéng)n",User); strcpy(Pass,str+i+1); for(i=1;i<strlen(Pass);i++) if(Pass[i]=='*') break; Pass[i]='\0'; printf("%s用戶發(fā)送\n",Pass); t=findUser(data,num,User); if(t==-1) { strcpy(response,"60"); printf("單聊對(duì)象不存在"); } else { if(data[t]->Log==0) { strcpy(response,"61"); printf("%s未在線\n",User); } elseif(data[t]->Log==1){ strcpy(response,"50"); strcat(response,Pass); strcat(response,":"); strcat(response,Pass+i+1); printf("%s:%s\n",Pass,Pass+i+1); printf("%s在線,可進(jìn)行聊天\n",User); } } }}voidMySendMessage(intsSocket,char*response,intresponseLen,SOCKADDR*cli,intcliLen){ intiSend; iSend=sendto(sSocket,response,responseLen,0,(SOCKADDR*)cli,cliLen); if(iSend==SOCKET_ERROR) { printf("sendto()Failed.:%d\n",WSAGetLastError()); } elseif(iSend==0); else { //printf("sendto()succeeded!\n"); //printf("\n"); }}boolInitData(UserData**s,intnum,int&p)//成功返回true發(fā)生錯(cuò)誤返回false{ //// //讀取文件信息并返回 FILE*fp; charUserBuf[UserNameLen]; charPassBuf[PasswordLen]; fp=fopen(thefile,"r"); if(!fp) { if(Debug) printf("config文件不存在\n"); } else { if(Debug) printf("findconfig.txt\n"); while(!feof(fp)) { //fgets(buf,sizeof(buf),fp); fscanf(fp,"%s",UserBuf); fscanf(fp,"%s",PassBuf); if(Debug) printf("[+]User:%sPassword:%s\n",UserBuf,PassBuf); //add p++; s[p]=(UserData*)malloc(sizeof(UserData)); if(!s[p]){printf("[+]ERROR:mallocfailed!\n");returnfalse;} strcpy(s[p]->UserName,UserBuf); strcpy(s[p]->Password,PassBuf); s[p]->Log=0; memset(s[p]->Ip,'\0',sizeof(s[p]->Ip)); } fclose(fp); } returntrue;}boolSaveData(UserData**userdata,intuserdatap){ FILE*fp; ///建立配置文件 fp=fopen(thefile,"w"); if(!fp){printf("[+]ERROR:無(wú)法創(chuàng)建config文件!");returnfalse;}; inti; for(i=0;i<=userdatap;i++) { fprintf(fp,"%s%s",userdata[i]->UserName,userdata[i]->Password); if(i!=userdatap)fprintf(fp,"\n"); } fclose(fp);}#include<winsock2.h>#include<stdlib.h>#include<stdio.h>#pragmacomment(lib,"ws2_32.lib")#include"ser.h"http://UserData*userdata[MaxUser];intuserdatap=-1;#defineBUFFER_SIZE2048voidCompressArrays(WSAEVENTevents[],SOCKETsockets[],DWORD*total,intindex){ for(size_ti=index+1;i<*total;i++) { events[i-1]=events[i]; } *total--;}intmain(intargc,char**argv){ // InitData(userdata,MaxUser,userdatap); charresponse[BUFFER_LENGTH]; WSADATAwsaData; charbuffer[BUFFER_SIZE]; sockaddr_inInternetAddr; //客戶地址 structsockaddr_incli; structsockaddr_incliArray[WSA_MAXIMUM_WAIT_EVENTS]; intiLen; iLen=sizeof(cli); //udp發(fā)送 SOCKETsSocket; structsockaddr_inser; charsend_buf[]="udp!"; SOCKETsClient; SOCKETSocketArray[WSA_MAXIMUM_WAIT_EVENTS]; WSANETWORKEVENTSNetworkEvents; WSAEVENTNewEvent; WSAEVENTEventArray[WSA_MAXIMUM_WAIT_EVENTS]; SOCKETAccept,Listen; DWORDEventTotal=0; DWORDIndex; if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("WSAStartup()\n"); return0; } //創(chuàng)建一個(gè)流式套接口 Listen=socket(AF_INET,SOCK_STREAM,0); InternetAddr.sin_family=AF_INET; InternetAddr.sin_addr.s_addr=htonl(INADDR_ANY); InternetAddr.sin_port=htons(5050); if(bind(Listen,(PSOCKADDR)&InternetAddr,sizeof(InternetAddr))==SOCKET_ERROR) { printf("bind()\n"); return0; } printf("\n"); printf("ServerWaiting\n"); printf("\n"); //創(chuàng)建一個(gè)事件對(duì)象 NewEvent=WSACreateEvent(); //在Listen套接口上注冊(cè)套接口連接和關(guān)閉網(wǎng)絡(luò)事件 WSAEventSelect(Listen,NewEvent,FD_ACCEPT|FD_CLOSE); if(listen(Listen,5)==SOCKET_ERROR) { printf("listen()\n"); return0; } SocketArray[EventTotal]=Listen; EventArray[EventTotal]=NewEvent; EventTotal++; //udp sSocket=socket(AF_INET,SOCK_DGRAM,0); if(sSocket==INVALID_SOCKET){ printf("failed"); return0; } ser.sin_family=AF_INET; ser.sin_port=htons(5051); //ser.sin_addr.s_addr=inet_addr("127.0.0.1"); while(true) { //在全部套接口上等候網(wǎng)絡(luò)事件發(fā)生 Index=WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE); if(WSAEnumNetworkEvents(SocketArray[Index-WSA_WAIT_EVENT_0], EventArray[Index-WSA_WAIT_EVENT_0], &NetworkEvents)==SOCKET_ERROR) { printf("%d/n",WSAGetLastError()); printf("WSAEnumNetworkEvents()\n"); return0; } //檢驗(yàn)FD_ACCEPT if(NetworkEvents.lNetworkEvents&FD_ACCEPT) { if(NetworkEvents.iErrorCode[FD_ACCEPT_BIT]!=0) { WSACloseEvent(EventArray[Index-WSA_WAIT_EVENT_0]); printf("FD_ACCEPTfailedwitherror%d\n",NetworkEvents.iErrorCode[FD_ACCEPT_BIT]); break; } //接收新連接,并將其存入套接口數(shù)組 Accept=accept(SocketArray[Index-WSA_WAIT_EVENT_0],(structsockaddr*)&cli,&iLen); //當(dāng)套接口數(shù)量超界時(shí),關(guān)閉該套接口 if(EventTotal>WSA_MAXIMUM_WAIT_EVENTS) { printf("Toomanyconnections"); closesocket(Accept); break; } NewEvent=WSACreateEvent(); if(NewEvent==WSA_INVALID_EVENT) { printf("WSACreateEvent()\n"); break; } WSAEventSelect(Accept,NewEvent,FD_READ|FD_WRITE|FD_CLOSE); EventArray[EventTotal]=NewEvent; SocketArray[EventTotal]=Accept; cliArray[EventTotal]=cli; EventTotal++; printf("Socket%dconnected\n",Accept); } //一下處理FD_READ通知 if(NetworkEvents.lNetworkEvents&FD_READ) { if(NetworkEvents.iErrorCode[FD_READ_BIT]!=0) { WSACloseEvent(EventArray[Index-WSA_WAIT_EVENT_0]); printf("FD_READfailedwitherror%d\n",NetworkEvents.iErrorCode[FD_READ_BIT]); break; } //從套接口讀入數(shù)據(jù) intiRecv=recv(SocketArray[Index-WSA_WAIT_EVENT_0],buffer,sizeof(buffer),0); if(iRecv==0) { break; } elseif(iRecv==SOCKET_ERROR) { printf("recv()\n"); break; } else { //請(qǐng)求端IP ser.sin_addr.s_addr=inet_addr(inet_ntoa(cliArray[Index-WSA_WAIT_EVENT_0].sin_addr)); printf("AcceptedclientIP:[%s],port:[%d]\n",inet_ntoa(cliArray[Index-WSA_WAIT_EVENT_0].sin_addr),ntohs(cliArray[Index-WSA_WAIT_EVENT_0].sin_port)); printf("recv:%s\n",buffer); memset(response,'\0',sizeof(response)); deal(buffer,userdata,userdatap,response,inet_ntoa(cliArray[Index-WSA_WAIT_EVENT_0].sin_addr)); printf("response:%s\n",response); inti; if(response[0]=='2'&&response[1]=='0') {//處理20群聊 printf("recv:%s\n",buffer); for(i=0;i<=userdatap;i++) { if(userdata[i]->Log==0)continue; ser.sin_addr.s_addr=inet_addr(userdata[i]->Ip); MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser)); } } elseif(response[0]=='5'&&response[1]=='0') {//處理50單聊 charstrwchy[2048]; strcpy(strwchy,response); printf("recv:%s\n",buffer); for(i=1;i<strlen(strwchy);i++) if(strwchy[i]==':') break; strwchy[i]='\0'; printf("strwchy:%s\n",strwchy+2); for(i=0;i<=userdatap;i++) { if(strcmp((buffer+1),(strwchy+2))==0){ if(strcmp((strwchy+2),userdata[i]->UserName)==0){ //發(fā)送給單聊對(duì)象 ser.sin_addr.s_addr=inet_addr(userdata[i]->Ip); MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser)); } } else{ if(strcmp((buffer+1),userdata[i]->UserName)==0){ //發(fā)送給單聊對(duì)象 ser.sin_addr.s_addr=inet_addr(userdata[i]->Ip); MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser)); } if(strcmp((strwchy+2),userdata[i]->UserName)==0){ //發(fā)送給單聊對(duì)象 ser.sin_addr.s_addr=inet_addr(userdata[i]->Ip); MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser)); } } } } elseif(response[0]=='4'&&response[1]=='0') {//處理40在線人數(shù) printf("recv:%s\n",buffer); for(i=0;i<=userdatap;i++) { if(strcmp((buffer+1),userdata[i]->UserName)==0){ //發(fā)到請(qǐng)求方接收端 ser.sin_addr.s_addr=inet_addr(userdata[i]->Ip); MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser)); } } } else { MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser)); } } } //以下處理FD_CLOSE通知 if(NetworkEvents.lNetworkEvents&FD_CLOSE) { if(NetworkEvents.iErrorCode[FD_WRITE_BIT]!=0) { WSACloseEvent(EventArray[Index-WSA_WAIT_EVENT_0]); printf("FD_WRITEfaieldwitherror%d\n",NetworkEvents.iErrorCode[FD_WRITE_BIT]); break; } //關(guān)閉套接口 closesocket(SocketArray[Index-WSA_WAIT_EVENT_0]); //從套接口事件和事件數(shù)組中刪除關(guān)閉套接口關(guān)于信息 CompressArrays(EventArray,SocketArray,&EventTotal,Index-WSA_WAIT_EVENT_0); } } WSACleanup(); return0;}第3章服務(wù)器設(shè)計(jì)3.1流程圖3.2代碼#include<WinSock2.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#pragmacomment(lib,"ws2_32.lib")#defineDEFAULT_PORT5051//FORRECV#defineBUFFER_LENGTH1000voidMySendMessage(SOCKETsSocket,char*response,intresponseLen,structsockaddr*cli,intcliLen);voidmain(){ intiPort=DEFAULT_PORT; WSADATAwsaData; SOCKETsSocket,wchysSocket; intiLen,wchyiLen; intiSend; intiRecv; charsend_buf[1000]; charname[255]; charrecv_buf[BUFFER_LENGTH]; char*ip; PHOSTENThostinfo; structsockaddr_inser,cli,wchy; if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) {printf("FailedtoloadWinsock.\n");return;} if(gethostname(name,sizeof(name))==0) { if((hostinfo=gethostbyname(name))!=NULL) { ip=inet_ntoa(*(structin_addr*)*hostinfo->h_addr_list); } } printf("\n"); printf("cServerWaiting\n"); printf("ip%s\n",ip); printf("\n"); sSocket=socket(AF_INET,SOCK_DGRAM,0); if(sSocket==INVALID_SOCKET){printf("socket()Faild:%d\n",WSAGetLastError());return;} ser.sin_family=AF_INET; ser.sin_port=htons(iPort); ser.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(sSocket,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR) {printf("bind()Faild:%d\n",WSAGetLastError());return;} iLen=sizeof(cli); memset(recv_buf,0,sizeof(recv_buf)); while(1) { //接收數(shù)據(jù)包確定cli表示cli存有客戶端發(fā)來(lái)ip和port iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen); if(iRecv==SOCKET_ERROR) {printf("recvfrom()Faild:%d\n",WSAGetLastError());return;} elseif(iRecv==0)break; else {//接收到了正確數(shù)據(jù) //printf("[+]%s\n",recv_buf); //控制信息種類有000110111220213031 //00注冊(cè)成功01注冊(cè)失敗10登陸成功11.12表示登陸失敗20表示一次成功會(huì)話21表示錯(cuò)誤會(huì)話30表示成功推出31表示錯(cuò)誤推出 switch(recv_buf[0]) { case'0': if(recv_buf[1]=='0')printf("注冊(cè)成功\n"); elseprintf("注冊(cè)失敗\n"); break; case'1': if(recv_buf[1]=='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:%d\n",WSAGetLastError());return;} wchyiLen=sizeof(wchy); strcpy(send_buf,"##"); MySendMessage(wchysSocket,send_buf,sizeof(send_buf),(structsockaddr*)&wchy,wchyiLen); } elseif(recv_buf[1]=='@') { 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,SOCK_DGRAM,0); if(wchysSocket==INVALID_SOCKET) {printf("socket()Failed:%d\n",WSAGetLastError());return;} wchyiLen=sizeof(wchy); strcpy(send_buf,"**"); MySendMessage(wchysSocket,send_buf,sizeof(send_buf),(structsockaddr*)&wchy,wchyiLen); } else{ printf("登陸失敗\n"); wchy.sin_family=AF_INET; w

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論