您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Socket编程利用TCP协议的实验报告
..Socket编程报告(TCP/IP协议)..一.实验目的通过C++来实现TCP/IP协议下的Socket编程.掌握TCP协议的算法实现。二.实验原理客户端建立Socket.通过端口号和地址确定目标服务器.使用Connect连接到服务器.send发送消息.等待处理.通信完成后调用CloseSocket关闭Socket服务端建立Socket.声明自身的端口号和地址并绑定到Socket.使用Listen打开监听.然后不断用Accept去查看是否有连接.如果有.捕获Socket.并通过Recv获取消息的内容.通信完成后调用CloseSocket关闭这个对应Accept到的Socket.如果不再需要等待任何客户端连接.那么用CloseSocket关闭掉自身的Socket三.实验代码(C++实现)服务器端代码如下:#pragmaonce#includestdio.h#includewinsock.h#pragmacomment(lib,ws2_32.lib)classCServerNet{public://初始化服务器,返回0表示成功intInit(constchar*address,intport);//更新数据voidRun();private:SOCKETm_sock;};intCServerNet::Init(constchar*address,intport){intrlt=0;//用于记录错误信息.并输出intiErrorMsg;//初始化WinSockWSADatawsaData;iErrorMsg=WSAStartup(MAKEWORD(1,1),&wsaData);if(iErrorMsg!=NO_ERROR){//初始化WinSock失败printf(wsastartupfailedwitherror:%d\n,iErrorMsg);rlt=1;returnrlt;..}//创建服务端Socketm_sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(m_sock==INVALID_SOCKET){//创建Socket异常printf(socketfailedwitherror:%d\n,WSAGetLastError());rlt=2;returnrlt;}//声明信息sockaddr_inserverAddr;serverAddr.sin_family=AF_INET;serverAddr.sin_port=port;serverAddr.sin_addr.s_addr=inet_addr(address);//绑定iErrorMsg=bind(m_sock,(sockaddr*)&serverAddr,sizeof(serverAddr));if(iErrorMsg0){//绑定失败printf(bindfailedwitherror:%d\n,iErrorMsg);rlt=3;returnrlt;}returnrlt;}voidCServerNet::Run(){//公开连接listen(m_sock,5);sockaddr_intcpAddr;intlen=sizeof(sockaddr);SOCKETnewSocket;charbuf[1024];intrval;do{//接收信息newSocket=accept(m_sock,(sockaddr*)&tcpAddr,&len);..if(newSocket==INVALID_SOCKET){//非可用socket}else{//新socket连接printf(newsocketconnect:%d\n,newSocket);//消息处理do{printf(process\n);//接收数据memset(buf,0,sizeof(buf));rval=recv(newSocket,buf,1024,0);if(rval==SOCKET_ERROR)//这应该是个异常.当客户端没有调用closeSocket就直接退出游戏的时候.将会进入这里printf(recvsocketerror\n);if(rval==0)//recv返回0表示正常退出printf(endingconnection);else//显示接收到的数据printf(recv%s\n,buf);}while(rval!=0);//关闭对应Accept的socketclosesocket(newSocket);}}while(1);//关闭自身的Socketclosesocket(m_sock);}intmain(intargc,char**argv){CServerNetserverNet;intiRlt=serverNet.Init(127.0.0.1,8888);..if(iRlt==0){printf(initok...\n);serverNet.Run();}elseprintf(serverNetinitfailedwitherror:%d\n,iRlt);system(pause);}客户端代码如下:#pragmaonce#includestdio.h#includewindows.h#pragmacomment(lib,Ws2_32.lib)classCClientNet{public://连接上指定服务器intConnect(intport,constchar*address);//发送信息intSendMsg(constchar*msg,intlen);//关闭voidClose();private:SOCKETm_sock;};intCClientNet::Connect(intport,constchar*address){intrlt=0;//用于记录错误信息并输出intiErrMsg;//启动WinSockWSADatawsaData;iErrMsg=WSAStartup(MAKEWORD(1,1),&wsaData);if(iErrMsg!=NO_ERROR)//有错误{printf(failedwithwsaStartuperror:%d\n,iErrMsg);rlt=1;returnrlt;}..//创建Socketm_sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(m_sock==INVALID_SOCKET)//创建Socket失败{printf(socketfailedwitherror:%d\n,WSAGetLastError());rlt=2;returnrlt;}//目标服务器数据sockaddr_insockaddrServer;sockaddrServer.sin_family=AF_INET;sockaddrServer.sin_port=port;sockaddrServer.sin_addr.s_addr=inet_addr(address);//连接,sock与目标服务器连接iErrMsg=connect(m_sock,(sockaddr*)&sockaddrServer,sizeof(sockaddrServer));if(iErrMsg0){printf(connectfailedwitherror:%d\n,iErrMsg);rlt=3;returnrlt;}returnrlt;}intCClientNet::SendMsg(constchar*msg,intlen){intrlt=0;intiErrMsg=0;//发送消息.指定sock发送消息iErrMsg=send(m_sock,msg,len,0);if(iErrMsg0)//发送失败{printf(sendmsgfailedwitherror:%d\n,iErrMsg);rlt=1;..returnrlt;}returnrlt;}voidCClientNet::Close(){closesocket(m_sock);}intmain(){CClientNetclient;//连接到127.0.0.1(即本地),端口号为8888的服务端printf(Connect\n);client.Connect(8888,127.0.0.1);//发送消息printf(sendmsg\n);client.SendMsg(hello\0,sizeof(hello\0));//关闭socketprintf(close\n);client.Close();system(pause);}四.实验结果..五.心得体会通过本次实验.我了解了TCP/IP协议与UDP协议的异同之处.理解了Socket在通信中..的地位和作用。在调试程序过程中的查错纠错也让我对程序有了深刻的理解.虽然程序是借鉴他人的.但我通过调试之后的进一步解析阅读也掌握了其中的原理.收获颇丰。欢迎您的光临,Word文档下载后可修改编辑.双击可删除页眉页脚.谢谢!希望您提出您宝贵的意见,你的意见是我进步的动力。赠语;1、如果我们做与不做都会有人笑,如果做不好与做得好还会有人笑,那么我们索性就做得更好,来给人笑吧!2、现在你不玩命的学,以后命玩你。3、我不知道年少轻狂,我只知道胜者为王。4、不要做金钱、权利的奴隶;应学会做“金钱、权利”的主人。5、什么时候离光明最近?那就是你觉得黑暗太黑的时候。6、最值得欣赏的风景,是自己奋斗的足迹。7、压力不是有人比你努力,而是那些比你牛×几倍的人依然比你努力。
本文标题:Socket编程利用TCP协议的实验报告
链接地址:https://www.777doc.com/doc-4588329 .html