您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 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在通信中的地位和作用。在调试程序过程中的查错纠错也让我对程序有了深刻的理解,虽然程序是借鉴他人的,但我通过调试之后的进一步解析阅读也掌握了其中的原理,收获颇丰。
本文标题:Socket编程利用TCP协议的实验报告
链接地址:https://www.777doc.com/doc-7255124 .html