TCPIP大作业-基于Socket的网络通信.doc_第1页
TCPIP大作业-基于Socket的网络通信.doc_第2页
TCPIP大作业-基于Socket的网络通信.doc_第3页
TCPIP大作业-基于Socket的网络通信.doc_第4页
TCPIP大作业-基于Socket的网络通信.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录编号TCP/IP协议与网络编程期末大作业题目: 基于Socket的网络通信 物联网工程 学院 计算机科学与技术 专业学 号 学生姓名 任课教师 二一六年五月26摘 要此TCP/IP课程设计实现了基于TCP的客户/服务器通信程序,具体实验过程通过有连接服务为主体,无连接服务为辅并利用事件对象I/O管理来实现。客户机具有注册,登陆,单聊,私聊,退出等功能。关键词:TCP/IP、有连接、通信程序目录目录第1章 总体设计2第2章 客户端设计42.1 发送端设计42.11 流程图42.12 代码52.2接收端设计122.21 流程图122.22 代码12第3章 服务器设计183.1 流程图183.2 代码18第4章 运行结果25硬件结构设计第1章 总体设计1、基本通信协议选取TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。而UDP则不为IP提供可靠性、流控或差错恢复功能。TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。本次实验基于TCP/IP协议利用事件对象I/O管理实现基本的聊天功能,包括注册,登录,群聊,私聊及在线人数统计。2、通信过程设计2.1客户端设计a. 本地服务器主要功能:1)接收远程服务器转发的消息并显示消息。b. 本地客户端主要功能:1)发送建立TCP连接的请求操作;2)发送注册信息,登陆消息及退出请求;3)发送群聊消息,私聊消息,在线人数统计及退出请求。2.2服务器端设计a. 远程服务端主要功能:1)监听客户端的连接请求;2)提供注册服务,验证登陆请求和验证功能;3)查看在线人数,发送在线状态;4)发送群聊消息及私聊消息。3、程序流程图 第2章 客户端设计2.1 发送端设计2.11 流程图2.12 代码#include #include #include #pragma comment(lib, Ws2_32.lib)#define BUFFER_SIZE 1024void MySendMessage(SOCKET sSocket,char *response,int responseLen);int main(int argc, char *argv)WSADATA wsaData;sockaddr_in ser,cli;SOCKET sClient,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(手动连接模式中.n);char szServer256;/连接的服务器地址,IP地址printf(请输入即将连接的服务器IP地址:);gets(szServer);ser.sin_family = AF_INET;ser.sin_port = htons(5050);ser.sin_addr.s_addr = inet_addr(szServer);char user20,password20;char str100,str1100,wchystr100;bool hasLogin=false;/只能绑定一次,开始放在了循环里,555wchysClient=socket(AF_INET,SOCK_DGRAM,0);if(wchysClient=INVALID_SOCKET)printf(socket()Faild:%dn,WSAGetLastError();return 0;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:%dn,WSAGetLastError();return 0;wchyiLen=sizeof(cli);memset(recv_buf,0,sizeof(recv_buf);sClient = socket(AF_INET, SOCK_STREAM, 0);if (sClient = INVALID_SOCKET)printf(socket()n);return 0;if (connect(sClient, (sockaddr*)&ser, sizeof(ser) = INVALID_SOCKET)printf(socket()n);return 0;elsebool hasLogin=false;while(!hasLogin)printf(-n);printf(0.注册n);printf(1.登陆n);printf(2.退出n);printf(请输入相应的数字:n);scanf(%s,&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(密 码:);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:%dn,WSAGetLastError();return 0;else if(iRecv=0) break;else / 接收到了正确数据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(已经在其他地方登陆n);printf(登录失败!请重新选择用户登录或注册后登录_n);if(recv_buf0=#&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(请输入相应的数字:n);scanf(%s,&wchystr);switch(wchystr0)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);elsesystem(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:%dn,WSAGetLastError();return 0;else if(iRecv=0) break;else / 接收到了正确数据/printf(recv:%sn,recv_buf);if(recv_buf0=&recv_buf1=)wchyhasLogin=0;system(cls);printf(单聊对象不存在,退出了单聊模式n);if(recv_buf0=&recv_buf1=&)wchyhasLogin=0;system(cls);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);MySendMessage(sClient, send_buf, sizeof(send_buf);elsesystem(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();return 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);2.2接收端设计2.21 流程图2.22 代码#include#include#include#include#pragma comment(lib,ws2_32.lib)#define DEFAULT_PORT 5051/FOR RECV#define BUFFER_LENGTH 1000void MySendMessage(SOCKET sSocket,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 Waitingn);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(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)/接收数据包 确定cli 表示 cli存有客户端发来的 ip和port iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen);if(iRecv=SOCKET_ERROR)printf(recvfrom()Faild:%dn,WSAGetLastError();return;else if(iRecv=0) break;else / 接收到了正确数据/printf(+%sn,recv_buf);/控制信息的种类有00 01 10 11 12 20 21 30 31/00注册成功 01 注册失败 10登陆成功 11.12表示登陆失败 20表示一次成功会话 21表示错误会话 30表示成功推出 31表示错误推出switch(recv_buf0)case 0:if(recv_buf1=0)printf(注册成功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();return;wchyiLen=sizeof(wchy);strcpy(send_buf,#);MySendMessage(wchysSocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyiLen);else if(recv_buf1=)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,*);MySendMessage(wchysSocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyiLen);elseprintf(登陆失败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,);MySendMessage(wchysSocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyiLen);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(socket()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);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);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,&);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 len, 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(iSend=0) ;else/printf(sendto() succeeded !n);/printf(-n);第3章 服务器设计3.1 流程图3.2 代码#include #include #include #pragma comment(lib,ws2_32.lib)#includeinit.h#includedeal.h/UserData *userdataMaxUser;int userdatap=-1;#define BUFFER_SIZE 2048void 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(Accept);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 connectedn, 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;/ 从套接口读入数据int iRecv = recv(SocketArrayIndex - WSA_WAIT_EVENT_0, buffer, sizeof(buffer), 0);if (iRecv = 0)break;else if (iRecv = SOCKET_ERROR)printf(recv()n);break;else/请求端IPser.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_0.sin_addr);printf(response:%sn,response);int i;if(response0=2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论