首页 TCPIP协议与网络编程期末大作业

TCPIP协议与网络编程期末大作业

举报
开通vip

TCPIP协议与网络编程期末大作业TCPIP协议与网络编程期末大作业编号TCP/IP协议与网络编程期末大作业题目:基于Socket的网络通信物联网工程学院计算机科学与技术专业学号学生姓名任课教师二〇一六年X月摘要课题是基于TCP/UDP协议编写聊天室系统。聊天室系统主要包括注册、登陆、群聊、单聊、显示在线人员和退出功能。系统主要包括客户端、服务器端和客户显示端。其中客户端与服务器端的连接基于TCP协议,服务器端向客户显示端发送数据是基于UDP协议。课题是网络协议栈中传输层的应用,在网络成的基础上,在传输层中使用网络套接字,达到数据传送的目的,从而实...

TCPIP协议与网络编程期末大作业
TCPIP 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 与网络编程期末大作业编号TCP/IP协议与网络编程期末大作业题目:基于Socket的网络通信物联网工程学院计算机科学与技术专业学号学生姓名任课教师二〇一六年X月摘要课题是基于TCP/UDP协议编写聊天室系统。聊天室系统主要包括注册、登陆、群聊、单聊、显示在线人员和退出功能。系统主要包括客户端、服务器端和客户显示端。其中客户端与服务器端的连接基于TCP协议,服务器端向客户显示端发送数据是基于UDP协议。课题是网络协议栈中传输层的应用,在网络成的基础上,在传输层中使用网络套接字,达到数据传送的目的,从而实现聊天室系统功能。关键词:TCP/UDP;聊天室;网络套接字;数据传送目录第1章总体设计2第2章客户端设计32.1发送端设计32.11 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图32.12代码32.2接收端设计32.21流程图32.22代码3第3章服务器设计43.1流程图43.2代码4第4章运行结果5第1章总体设计1原理1.1TCP在面向连接的数据流(SOCK_STREAM)传输过程中,设计基于TCP/IP协议的程序是传输层使用TCP协议,它的最大的特点是在通信之前要在客户和服务器之间先建立连接,在数据传输完成后要关闭连接,释放网络资源。面向连接的客户/服务器程序工作模型如下:1.2UDP无连接的数据报(SOCK_DGRAM)传输服务在传输层使用的协议时UDP协议。与面向连接的通信协议过程不同,它的最大的特点就是必须要在客户和服务器之间建立连接,通信的任何一方可以先发送数据,这样首先发送数据的一方就成为客户端,而接收数据的一方就是服务器端。在数据传输完毕后,只要关闭套接口,释放网络资源,通信过程就结束了。无连接的数据包传输服务通信是,客户端与服务器端所使用的函数是类似的。面向无连接的客户/服务器程序工作模型如下:1.3流程图基于TCP/UDP的聊天室系统包括客户端、客户显示端和服务器端三部分。功能主要是注册、登陆、群聊、单聊、显示在线人员和退出。客户端与服务器端的连接协议基于TCP协议,服务器端发送功能基于UDP协议。客户端与服务器端建立连接后,客户端进行操作,将数据发送至客户显示端。第2章客户端设计2.11流程图2.12代码#include#include#include#pragmament(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(“手动连接模式中....\n“);charszServer[256];//连接的服务器地址,IP地址printf(“请输入即将连接的服务器IP地址:“);gets(szServer);ser.sin_family=AF_INET;ser.sin_port=htons(5050);ser.sin_addr.s_addr=i_addr(szServer);charuser[20],password[20];charstr[100],str1[100],wchystr[100];boolhasLogin=false;//只能绑定一次,开始放在了循环里,555wchysClient=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.注册\n“);printf(“1.登陆\n“);printf(“2.退出\n“);printf(“请输入相应的数字:\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{//接收到了正确数据printf(“recv:%s\n“,recv_buf);}if(recv_buf[0]=='@'&&recv_buf[1]=='@'){hasLogin=0;system(“cls“);printf(“登录失败!请重新登录或注册后登录^_^\n“);}if(recv_buf[0]=='*'&&recv_buf[1]=='*'){hasLogin=0;system(“cls“);printf(“已经在其他地方登陆\n“);printf(“登录失败!请重新选择用户登录或注册后登录^_^\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(“请输入相应的数字:\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(“请输入单聊对象的用户名:“);scanf(“%s“,&str1);strcpy(send_buf,“5“);strcat(send_buf,str1);strcat(send_buf,“@“);strcat(send_buf,user);strcat(send_buf,“*“);strcat(send_buf,“__Wele__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{//接收到了正确数据//printf(“recv:%s\n“,recv_buf);}if(recv_buf[0]=='^'&&recv_buf[1]=='^'){wchyhasLogin=0;system(“cls“);printf(“单聊对象不存在,退出了单聊模式\n“);}if(recv_buf[0]=='&'&&recv_buf[1]=='&'){wchyhasLogin=0;system(“cls“);printf(“单聊对象未在线,退出了单聊模式\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(“请输入正确信息\n“);break;}}}break;case'2':exit(0);break;default:system(“cls“);printf(“请输入正确信息“);}}}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()sueeded!\n“);printf(“----------------------\n“);}}2.2接收端设计2.21流程图2.22代码#include#include//formain.cpp(1.cpp)#defineDEFAULT_PORT5051//FORRECV#defineDEFAULT_PORTSEND5052//FORSEND#defineBUFFER_LENGTH1000constboolDebug=0;#defineMaxUser1000//--------------------------------------------------------------------------------////当程序遇到异常而结束时会示出错误而退出//--------------------------------------------------------------------------------////成员结构信息#defineUserNameLen200#definePasswordLen200typedefstruct{charUserName[200];charPassword[200];boolLog;//是否登陆charIp[20];}UserData;#definethefile“config.txt“boolSaveData(UserData**userdata,intuserdatap);//--------------------------------------------------------------------------------////初始化用户数据导入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];//第一位字符是功能号//0注册//1登陆//2会话//3退出inti,t;if(str[0]=='0'){//注册的消息格式为0+name+@+passwordfor(i=1;iUserName,User);strcpy(data[num]->Password,Pass);data[num]->Log=0;memset(data[num]->Ip,'\0',sizeof(data[num]->Ip));printf(“%s用户注册成功\n“,User);//--------------------------------------------------注册完成//返回成功信息strcpy(response,“00“);//第一位是功能号第二位是状态号0表示成功1表示失败SaveData(data,num);}else{//failprintf(“%s用户注册失败\n“,User);//-----------------------------------------------注册失败strcpy(response,“01“);}}elseif(str[0]=='1'){//登陆的消息格式为1+name+@+passwordfor(i=1;iPassword);if(strcmp(Pass,data[t]->Password)==0&&data[t]->Log==0){//密码验证成功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已经在其他地方登陆\n“,User);strcpy(response,“1@“);}else{printf(“%s登陆密码错误\n“,User);strcpy(response,“11“);}}else{printf(“%s用户不存在,登陆失败\n“,User);strcpy(response,“12“);}}elseif(str[0]=='2'){//会话的消息格式为2+'name'+'@'+'(message)'for(i=1;iUserName,User)==0&&strcmp(data[t]->Ip,ip)==0){//表示确实是正确用户发来的会话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(“非正确用户发来会话,不予处理!\n“);}}elseif(str[0]=='3'){//会话的消息格式为3+'name'+'@'+'(message)'for(i=1;iUserName,User)==0&&strcmp(data[t]->Ip,ip)==0){//表示确实是正确用户发来的会话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(“非正确用户发来会话,不予处理!“);}}elseif(str[0]=='4'){for(i=1;iLog==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;iLog==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在线,可进行聊天\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()sueeded!\n“);//printf(“----------------------\n“);}}boolInitData(UserData**s,intnum,int&p)//成功返回true发生错误返回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);//addp++;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:无法创建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#include#include#pragmament(lib,“ws2_32.lib“)#include“ser.h“//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_inInterAddr;//客户地址structsockaddr_incli;structsockaddr_incliArray[WSA_MAXIMUM_WAIT_EVENTS];intiLen;iLen=sizeof(cli);//udp发送SOCKETsSocket;structsockaddr_inser;charsend_buf[]=“udp!“;SOCKETsClient;SOCKETSocketArray[WSA_MAXIMUM_WAIT_EVENTS];WSANETWORKEVENTSNetworkEvents;WSAEVENTNewEvent;WSAEVENTEventArray[WSA_MAXIMUM_WAIT_EVENTS];SOCKETAept,Listen;DWORDEventTotal=0;DWORDIndex;if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf(“WSAStartup()\n“);return0;}//创建一个流式套接口Listen=socket(AF_INET,SOCK_STREAM,0);InterAddr.sin_family=AF_INET;InterAddr.sin_addr.s_addr=htonl(INADDR_ANY);InterAddr.sin_port=htons(5050);if(bind(Listen,(PSOCKADDR)&InterAddr,sizeof(InterAddr))==SOCKET_ERROR){printf(“bind()\n“);return0;}printf(“----------------------\n“);printf(“ServerWaiting\n“);printf(“----------------------\n“);//创建一个事件对象NewEvent=WSACreateEvent();//在Listen套接口上注册套接口连接和关闭的网络事件WSAEventSelect(Listen,NewEvent,FD_ACCEPT|FD_CLOSE);if(listen(Listen,5)==SOCKET_ERROR){printf(“listen()\n“);return0;}SocketArray[EventTotal]=Listen;EventArray[EventTotal]=NewEvent;EventTotal++;//udpsSocket=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=i_addr(“127.0.0.1“);while(true){//在所有套接口上等待网络事件的发生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;}//检查FD_ACCEPTif(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;}//接收新的连接,并将其存入套接口数组Aept=aept(SocketArray[Index-WSA_WAIT_EVENT_0],(structsockaddr*)&cli,&iLen);//当套接口的数量超界时,关闭该套接口if(EventTotal>WSA_MAXIMUM_WAIT_EVENTS){printf(“Toomanyconnections“);closesocket(Aept);break;}NewEvent=WSACreateEvent();if(NewEvent==WSA_INVALID_EVENT){printf(“WSACreateEvent()\n“);break;}WSAEventSelect(Aept,NewEvent,FD_READ|FD_WRITE|FD_CLOSE);EventArray[EventTotal]=NewEvent;SocketArray[EventTotal]=Aept;cliArray[EventTotal]=cli;EventTotal++;printf(“Socket%dconnected\n“,Aept);}//一下处理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;}//从套接口读入数据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{//请求端IPser.sin_addr.s_addr=i_addr(i_ntoa(cliArray[Index-WSA_WAIT_EVENT_0].sin_addr));printf(“AeptedclientIP:[%s],port:[%d]\n“,i_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,i_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=i_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;iUserName)==0){//发送给单聊对象ser.sin_addr.s_addr=i_addr(userdata[i]->Ip);MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser));}}else{if(strcmp((buffer+1),userdata[i]->UserName)==0){//发送给单聊对象ser.sin_addr.s_addr=i_addr(userdata[i]->Ip);MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser));}if(strcmp((strwchy+2),userdata[i]->UserName)==0){//发送给单聊对象ser.sin_addr.s_addr=i_addr(userdata[i]->Ip);MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser));}}}}elseif(response[0]=='4'&&response[1]=='0'){//处理40在线人数printf(“recv:%s\n“,buffer);for(i=0;i<=userdatap;i++){if(strcmp((buffer+1),userdata[i]->UserName)==0){//发到请求方的接收端ser.sin_addr.s_addr=i_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;}//关闭套接口closesocket(SocketArray[Index-WSA_WAIT_EVENT_0]);//从套接口事件和事件数组中删除关闭的套接口的有关信息CompressArrays(EventArray,SocketArray,&EventTotal,Index-WSA_WAIT_EVENT_0);}}WSACleanup();return0;}第3章服务器设计3.1流程图3.2代码#include#include#include#include#pragmament(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=i_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){//接收数据包确定cli表示cli存有客户端发来的ip和portiRecv=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{//接收到了正确数据//printf(“[+]%s\n“,recv_buf);//控制信息的种类有000110111220213031//00注册成功01注册失败10登陆成功11.12表示登陆失败20表示一次成功会话21表示错误会话30表示成功推出31表示错误推出switch(recv_buf[0]){case'0':if(recv_buf[1]=='0')printf(“注册成功\n“);elseprintf(“注册失败\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=i_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(“已经在其他地方登陆\n“);wchy.sin_family=AF_INET;wchy.sin_port=htons(5053);wchy.sin_addr.s_addr=i_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;wchy.sin_port=htons(5053);wchy.sin_addr.s_addr=i_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);}break;case'2':printf(“[群聊]%s\n“,recv_buf+2);break;case'4':printf(“在线用户列表:%s\n“,recv_buf+2);break;case'5':printf(“[单聊]“);wchy.sin_family=AF_INET;wchy.sin_port=htons(5053);wchy.sin_addr.s_addr=i_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);printf(“%s\n“,recv_buf+2);break;case'6':if(recv_buf[1]=='0'){printf(“单聊对象不存在\n“);wchy.sin_family=AF_INET;wchy.sin_port=htons(5053);wchy.sin_addr.s_addr=i_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]=='1'){printf(“单聊对象未在线\n“);wchy.sin_family=AF_INET;wchy.sin_port=htons(5053);wchy.sin_addr.s_addr=i_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);}break;}}}closesocket(sSocket);WSACleanup();}voidMySendMessage(SOCKETsSocket,char*response,intresponseLen,structsockaddr*cli,intcliLen){intiSend;//intsendto(sockets,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);iSend=sendto(sSocket,response,responseLen,0,(SOCKADDR*)cli,cliLen);//iSend=sendto(sClient,send_buf,sizeof(send_buf),0,(structsockaddr*)&ser,iLen);if(iSend==SOCKET_ERROR){printf(“sendto()Failed.:%d\n“,WSAGetLastError());}elseif(iSend==0);else{//printf(“sendto()sueeded!\n“);//printf(“----------------------\n“);}}第4章运行结果   
本文档为【TCPIP协议与网络编程期末大作业】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_179289
暂无简介~
格式:doc
大小:11KB
软件:Word
页数:19
分类:
上传时间:2019-05-18
浏览量:0