版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TCP/IP协议编程大作业学生姓名此TCP/IP课程设计实现了基于TCP的客户/服务器通 4 4 4 4 5 6 6 63、程序清单 6 2、客户端截图 37 一、总体设计TCP(TransmissionControlProtocol)和UDP(U本次实验基于TCP/IP协议利用事件对象I/0管理实现基本的聊天功能,2.1客户端设计1)接收远程服务器转发的消息并显示消息。b.本地客户端1)发送建立TCP连接的请求操作;2)发送注册信息,登陆消息及退出请求;3)发送群聊消息,私聊消息,在线人数统计及退出请求。2.2服务器端设计1)监听客户端的连接请求;2)提供注册服务,验证登陆请求和验证功能;3)查看在线人数,发送在线状态;4)发送群聊消息及私聊消息。‘0’‘@’‘1’‘@’0)群聊:‘2’‘@’str(内容)1)单聊:‘@’‘*’2)在线用户‘4’user(用户名)‘@’str(内容)3)退出(登录):输输单‘3’user(用户名)‘@’3.2服务端数据包设计:00’—注册成功01’—注册失败一用户名已存在b.登陆应答:‘10’—登陆成功12’—用户名不存在‘11’—密码不正确‘1@’—该用户已登陆c.聊天:61’—单聊对象不在线50’—单聊对象在线‘60’—单聊对象不存在2)群聊:“30’一广播消息31’—非正确用户的消息,不广播‘40’—显示当前在线人数并发给查询客户4、程序流程图证录是入聊群聊群名称否聊1.1注册:向服务器发送注册信息。然后接收服务器返回的应答信息。1.2登陆:向服务器发送登陆信息。接收服务器返回的应答信息。1.3聊天:登陆成功后,选择群聊或单聊进行聊天,选择在线用户可进行查询当前在线用户,选择退出可退出登录。a.单聊:从在线用户中选择一个,与其单聊b.群聊:向所有在线的用户发送消息c.退出聊天:退出此次聊天,但不断开连接d.退出登陆,断开连接,退出时不需要发送下线信息,直接退出1.4面向连接的客户/服务器程序工作模型:女客户机在注册或登陆时首先和服务器连接,注册完或登陆失败断开连接,登陆成功不断开连接,使用send和recv发送接收数据,根据上述的数据报的定义,发送相应的数据报。3.1客户端接收器(本地服务器)代码#pragmacomment(lib,"ws2_3#defineDEFAULT_PORT5051voidMySendMessage(SOCKETsSocket,char*response,intintiPort=DEFAULT_PORT;charrecv_buf[BUFFER_LENGTH];printf("----------------------\n"printf("cServerWaitingprintf("----------------------\n"ser.sin_addr.s_addr=htonl(INif(bind(sSocket,(LPSOCKADDR)&ser,sizeof(ser))==SOCK{printf("bind()Faildmemset(recv_buf,0,sizeof(recv_buf)){{printf("recvfrom()Faild:elseif(iRecv==0//控制信息的种类有000110111220213031//00注册成功01注册失败10登陆成功11.12表示登陆失败20表示一次成功会话21表示错误会话30表示成功推出31表示错误推出{wchy.sinport=htons(5053);{printf("socket()Failed:MySendMessage(wchysSocket,send_buf,sizeof(send_buf)}wchy.sin_port=htons(50{printf("socket()Failed:MySendMessage(wchysSocket,send_buf,sizeof(send_buf)wchy.sinport=htons(5053);{printf("socket()Failed:MySendMessage(wchysSocket,send_buf,sizeof(send_buf)wchy.sin_port=htons(50{printf("socket()Failed:MySendMessage(wchysSocket,send_buf,sizeof(send_buf){wchy.sinport=htons(505{printf("socket()Failed:MySendMessage(wchysSocket,send_buf,sizeof(send_buf){wchy.sinport=htons(5053);{printf("socket()Failed:MySendMessage(wchysSocket,send_buf,sizeof(send_buf)voidMySendMessage(SOCKETsSocket,char*response,intresponseLen,//intsendto(sockets,constvoid*msg,intlen,unsiiSend=sendto(sSocket,response,responseLen,0,(SOCKADDR*)c//iSend=sendto(sClient,send_buf,sizeof(send_buf),0,(structsockaddr*)&ser,i{printf("sendto()Failed.:%d\n",WSAGetLastErro{//printf("sendto()succeeded//printf("----------------------\#pragmacomment(lib,"Ws2_32.lib"){f(WSAStartup(MAKEWORD(2,2),&w{}charszServer[256];//连接的服务器地址,IP地址ser.sin_addr.s_addr=inet_addr(scharstr[100],str1[100],wchystr[100];//只能绑定一次,开始放在了循环里,555f(wchysClient==INVALID_SOCKET){printf{printf("bind()Faild:%d\n",WSAGetLastError()memset(recv_buf,0,sizif(connect(sClient,(sockaddr*)&ser,sizeof(printf("-----------------------printf("0.注册\n");printf("1.登陆\n");printf("请输入相应的数字:\n>");printf("用户名:");MySendMessage(sClient,send_buf,printf("用户名:");MySendMessage(sClient,send_buf,{printf("recvfrom()Faild:%d\n",WSAGetLastError());return0;}{//接收到了正确数据printf("登录失败!请重新登录或注册后登录^_^\n");printf("已经在其他地方登陆\n");printf("登录失败!请重新选择用户登录或注册后登录^_^\n");if(recv_buf[0]=='#'&&rboolwchyhasLogin=false;printf("---------------------printf("0.群聊\n");printf("1.单聊\n");printf(“2.在线用户\n”);printf("3.退出\n");printf("请输入相应的数字:\n>");printf("-------------------printf(">").{}printf("请输入单聊对象的用户名:");MySendMessage(sClient,send_buf,{printf("recvfrom()Faild:%d\n",WSAGetLastError());return0;}{//接收到了正确数据//printf("recv:%s\n",recv_buf).}if(recv_buf[0]=='^'&&printf("单聊对象不存在,退出了单聊模式\n");}if(recv_buf[0]=='&'&&printf("单聊对象未在线,退出了单聊模式\n");if(recv_buf[0]=='%'&&printf("----------------{}MySendMessage(sClient,send_buf,MySendMessage(sClient,send_buf,printf("请输入正确信息\n");}printf("请输入正确信息");printf("send()Failed.:%d\n",WS//printf("send()succeededprintf("-----------三、服务器端程序1.3接收客户机发来的聊天信息。将聊天信息转发给所有在线的ip。服务器端服务器端阻塞直到接收到客户连接请求4TCP三次握手数据请求数据响应关闭连接write()intfindUser(UserData**data,{{if(strcmp(name,data[i]->UserNa//0注册{t=findUser(data,num,Udata[num]=(UserData*)malloc(sizeof(UserData));strcpy(data[num]->Ustrcpy(data[num]->Pamemset(data[num]->Ip,’\0'{t=findUser(data,num,U//printf("Pawd=%s",data[t]->Passwoif(strcmp(Pass,data[t]->Paelseif(strcmp(Pass,data[t]->Password)==0&&data[t]->L{{{t=findUser(data,num,Ustrcmp(data[t]->Usestrcmp(data[t]->Use{}}t=findUser(data,num,Ustrcmp(data[t]->Use{memset(data[t]->Ip,’\0',sizeof(data[t]printf("%s退出\n",data[t]->UserName);{{{printf("%s[%s]在线\n",data[i]->UserName,data[i]->Ip)//printf("%s\n",data[i]->UserNastrcat(response,data[{t=findUser(data,num,U{{{voidMySendMessage(intsSocket,char*respiSend=sendto(sSocket,response,responseLen,0,(SOCKADDR*{printf("sendto()Failed.:%d\n",WSAGetLastErro{//printf("sendto()succee//printf("----------------------\//formain.cpp(1.cpp)#defineDEFAULT_PORT5051//FORR#defineDEFAULT_PORTSEND5//当程序遇到异常而结束时会示出错误而退出//-------------------------//成员结构信息#defineUserNameLentypedefLog;//是否登陆boolInitData(UserData**s,intnum,int&p)//成功返回true发生错误返回false{//-----------------------------------charUserBuf[UserNacharPassBuf[PasswordLen];{if(Debug)p}{{//fgets(buf,sizeof(buf),fPassword:%s\n",UserBuf,Pass[p]=(UserData*)malloc(sizeof(UserDatastrcpy(s[p]->Passwomemset(s[p]->Ip,'\0',sizeof(s[p]->boolSaveData(Useif(!fp){printf("[+]ERROR:无法创建config文件!");returnfalse;};fprintf(fp,"%s%s",userdata[i]->UserName,userdata[i]->Password);if(i!=userdatap)fprintf}#include<stdlib.h>#pragmacomment(lib,"ws2_3intuserdatapfor(size_ti=index+1;InitData(userdata,MaxUser,uWSADATAwsaDWSANETWORKEVENTSNetworkEvents;WSAEVENTNewEvent;SOCKETAccept,Lif(WSAStartup(MAKEWORD(2,2),&wsprintf("WSAStartup()\nListen=socket(AF_INET,SOCK_STInternetAddr.sin_famInternetAddr.sin_addr.s_addr=htonl(INADDR_ANY);InternetAddr.sin_port=htons(5050);{printf("----------------------\n"printf(“ServerWaitingprintf("----------------------\nNewEvent=WSACreateEvent(WSAEventSelect(Listen,NewEvent,FD_ACCEPT|FEventArray[EventTotal]={{printf("%d/n",WSAGetLastErrorprintf("WSAEnumNetworkEvents()\if(NetworkEvents.INetworkEvents&FD_ACCEPT){if(NetworkEvents.iErrorCode[FDACCEP{Accept=accept(SocketArray[Index-WSA_WAIT_EVENT_0],({printf("Toomanyco}NewEvent=WSACreateEvent(printf("WSACreateEvent()\WSAEventSelect(Accept,NewEvent,FD_READ|FD_WRITE|FEventArray[EventTotal]=%dconnected\n",if(NetworkEvents.1NetworkEvents&FD_REA{if(NetworkEvents.iErrorCode[FD_READ_BIT{intiRecv=recv(SocketArray[Index-WSA_WAI{{{ser.sin_addr.s_addr=inet_addr(inet_ntoaWSA_WAIT_EVENT_0].sin_adWSA_WAIT_EVENT_0].sin_pomemset(response,’\0',sizeof(respdeal(buffer,userdata,userdatap,response,inet_ntoa(clWSA_WAIT_EVENT_0].sin_adprintf("response:%s\n",responif(response[0]=='2’&&response{if(userdata[i]->Log==0ser.sin_addr.s_addr=inet_addr(usMySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,siz}elseif(response[0]=='5’&&response[1]=='0')printf("strwchy:%s\n",strwchy+{if(strcmp((buffer+1),(strwchyser.sin_addr.s_addr=inet_addr(usMySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,siz}if(strcmp((buffer+1),userdata[i]->Useser.sin_addr.s_addr=inet_addr(useMySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizser.sin_addr.s_addr=inet_addr(usMySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizelseif(response[0]=='4'&&{if(strcmp((buffer+1),userdata[i]->Useser.sin_addr.s_addr=inet_addr(usMySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizeof(ser)){MySendMessage(sSocket,response,sizeof(response),(SOCKADDR*)&ser,sizif(NetworkEvents.1NetworkEvents&FDCLOSE){if(NetworkEvents.iErrorCode[FD_WRIT{//关闭套接口//从套接口事件和事件数组中删除关闭的套接口的有关信息CompressArrays(EventArray,SocketAr1、服务器端截图AcceptedclientIP:[192.168.1.1951.pAcceptedclientIP:t192.168.1.1291.port:[18?1IP:[192.168.1.1291.porIP:[192.168.1.1291.portIP:t192.168.1.1281,port:IP:[192.168.1.1291.poAcceptedclientIP:1192.168.1.1291.poAcceptedclientIP:1192.168.1.1291.port:[10%?]BeceptedclientIP:L192.168.1.1951.port:[2306]ecv:5456R¹23*—Velcone_To_SinAeceptedclientIP:[192.168.1.19Pecv:5456e123-1'n—123_want_chat_t56用户培儿456在线,可进行聊天heceptedclientIP:(192.168.1.19456用户891192.168.1.1291在线Aeceptedclient1P:[192.0cv:54568?89*olcone_To—si456用户接收123(192.168.1.1951在线456[192.168.1.1281在线AcceptedclientIP:[192.168.1.1281.Port:[18?1]AeceptedclientIP:[192.168.1.1281.port:(18?1]AeceptedclientIP:[192.1123[192.168.1.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防溺水安全活动总结
- 社会实践部的述职报告
- 橱柜销售经理工作总结
- 家乡环境建议书
- 微教育阅读心得7篇
- 蔬菜年终总结6篇
- 市政道路监理会议纪要范文(3篇)
- 销售主管工作汇报模板4篇
- 种草莓教案5篇
- 2024年危险化学品经营单位主要负责人理论试题及答案
- 广东省省级政务信息化服务预算编制标准(运维服务分册)
- 工作汇报模板课件
- 汽车维修公务车辆定点维修车辆保养投标方案
- 5.2-质量管理体系要求-“5.2方针”条文理解与实施指导材料(雷泽佳编制-2023)
- 律师无业承诺书(共3篇)
- SWITCH 勇者斗恶龙11S 金手指 版本:v1.0.3 最大金币 最大迷你奖章 32倍经验 最大攻击 所有材料
- 部编版四上《中国古代神话》整本书导读课教学设计
- 园艺与健康知到章节答案智慧树2023年金陵科技学院
- 知识点解析《方向向量与直线的参数方程》
- 论思维可视化视域下的初中英语以读促写教学 论文
- 重度子痫前期、胎盘早剥急救演练
评论
0/150
提交评论