TCPIP协议与网络编程期末大作业.docx
- 文档编号:18469874
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:12
- 大小:19.72KB
TCPIP协议与网络编程期末大作业.docx
《TCPIP协议与网络编程期末大作业.docx》由会员分享,可在线阅读,更多相关《TCPIP协议与网络编程期末大作业.docx(12页珍藏版)》请在冰点文库上搜索。
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代码#includewinsock2.h#includestdlib.h#includestdio.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(“手动连接模式中....\n“);charszServer[256];//连接的服务器地址,IP地址printf(“请输入即将连接的服务器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;//只能绑定一次,开始放在了循环里,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(“请输入相应的数字:
\nscanf(“%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(“请输入相应的数字:
\nscanf(“%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,“__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{//接收到了正确数据//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()succeeded!
\n“);printf(“----------------------\n“);}}2.2接收端设计2.21流程图2.22代码#includestdlib.h#includestring.h//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,intnum,char*response,char*ip){charUser[UserNameLen];charPass[PasswordLen];//第一位字符是功能号//0注册//1登陆//2会话//3退出inti,t;if(str[0]=='0'){//注册的消息格式为0+name+@+passwordfor(i=1;istrlen(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){//该用户名不存在,可以注册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用户注册成功\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;istrlen(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)==0data[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)==0data[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;istrlen(str);i++)if(str[i]=='@')break;str[i]='\0';strcpy(User,str+1);t=findUser(data,num,User);if(t!
=-1strcmp(data[t]-UserName,User)==0strcmp(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;istrlen(str);i++)if(str[i]=='@')break;str[i]='\0';strcpy(User,str+1);t=findUser(data,num,User);if(t!
=-1strcmp(data[t]-UserName,User)==0strcmp(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;istrlen(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]-//printf(“%s\n“,data[i]-UserName);strcat(response,data[i]-UserName);strcat(response,““);}else{//printf(“%s“,data[i]-}}}elseif(str[0]=='5'){for(i=1;istrlen(str);i++)if(str[i]=='@')break;str[i]='\0';strcpy(User,str+1);printf(“%s用户接收\n“,User);strcpy(Pass,str+i+1);for(i=1;istrlen(Pass);i++)if(Pass[i]=='*')break;Pass[i]='\0';printf(“%s用户发送\n“,Pass);t=findUser(data,num,User);if(t==-1){strcpy(response,“60“);printf(“单聊对象不存在“);}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在线,可进行聊天\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());}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TCPIP 协议 网络 编程 期末 作业