《Socket编程利用TCP协议的实验报告》由会员分享,可在线阅读,更多相关《Socket编程利用TCP协议的实验报告(8页珍藏版)》请在金锄头文库上搜索。
1、Socket 编程报告( TCP/IP 协议)实验目的通过 C+ 来实现 TCP/IP 协议下的 Socket 编程,掌握 TCP 协议的算法实现实验原理Connect 连接到服务器,send 发送消息,等待处理,通信完客户端 建立 Socket ,通过端口号和地址确定目标服务器,使用 成后调用 CloseSocket 关闭 Socket服务端 建立 Socket ,声明自身的端口号和地址并绑定到 Socket ,使用 Listen 打开监听,然后不断用 Accept 去查看是否有连 接,如果有,捕获 Socket ,并通过 Recv 获取消息的内容,通信完成后调用 CloseSocket 关
2、闭这个对应 Accept 到的 Socket , 如果不再需要等待任何客户端连接,那么用 CloseSocket 关闭掉自身的 Socket三 实验代码( C+ 实现)服务器端代码如下:#pragma once#include #include #pragma comment (lib,ws2_32.lib)class CServerNetpublic:/ 初始化服务器 ,返回 0 表示成功int Init(const char* address,int port);/ 更新数据void Run();private:SOCKET m_sock;int CServerNet:Init( cons
3、t char* address,int port )int rlt = 0;/ 用于记录错误信息,并输出int iErrorMsg;/ 初始化 WinSockWSAData wsaData;iErrorMsg = WSAStartup(MAKEWORD(1,1),&wsaData);if (iErrorMsg != NO_ERROR) / 初始化 WinSock 失败printf(wsastartup failed with error : %dn,iErrorMsg); rlt = 1;return rlt;/ 创建服务端 Socketm_sock = socket(AF_INET,SOCK
4、_STREAM,IPPROTO_TCP);if (m_sock = INVALID_SOCKET)/ 创建 Socket 异常printf(socket failed with error : %dn,WSAGetLastError(); rlt = 2;return rlt;/ 声明信息sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = port;serverAddr.sin_addr.s_addr = inet_addr(address);/ 绑定iErrorMsg = bind(m_
5、sock,(sockaddr*)&serverAddr,sizeof(serverAddr); if (iErrorMsg 0)/ 绑定失败printf(bind failed with error : %dn,iErrorMsg);rlt = 3;return rlt;return rlt;void CServerNet:Run()/ 公开连接 listen(m_sock,5);sockaddr_in tcpAddr;int len = sizeof(sockaddr);SOCKET newSocket;char buf1024;int rval;do/ 接收信息newSocket = ac
6、cept(m_sock,(sockaddr*)&tcpAddr,&len);if (newSocket = INVALID_SOCKET)/ 非可用 socketelse/ 新 socket 连接 printf(new socket connect : %dn,newSocket);/ 消息处理do printf(processn);/ 接收数据 memset(buf,0,sizeof(buf);rval = recv(newSocket,buf,1024,0);if (rval = SOCKET_ERROR)/ 这应该是个异常,当客户端没有调用 closeSocket 就直接退出游戏的时候,
7、将会进入这里 printf(recv socket errorn);if (rval = 0)/recv 返回 0 表示正常退出 printf(ending connection);else/ 显示接收到的数据 printf(recv %sn,buf);while(rval != 0);/ 关闭对应 Accept 的 socket closesocket(newSocket); while (1);/ 关闭自身的 Socketclosesocket(m_sock);int main(int argc, char *argv)CServerNet serverNet;int iRlt = ser
8、verNet.Init(127.0.0.1,8888);if (iRlt = 0)printf(init ok.n);serverNet.Run();elseprintf(serverNet init failed with error : %dn,iRlt);system(pause);客户端代码如下:#pragma once#include #include#pragma comment(lib, Ws2_32.lib)class CClientNetpublic:/ 连接上指定服务器int Connect(int port,const char* address);/ 发送信息int S
9、endMsg(const char* msg,int len);/ 关闭void Close();private:SOCKET m_sock;int CClientNet:Connect( int port,const char* address )int rlt = 0;/ 用于记录错误信息并输出int iErrMsg;/ 启动 WinSockWSAData wsaData;iErrMsg = WSAStartup(MAKEWORD(1,1),&wsaData);if (iErrMsg != NO_ERROR)/ 有错误printf(failed with wsaStartup error
10、: %dn,iErrMsg); rlt = 1;return rlt;/ 创建 Socketm_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (m_sock = INVALID_SOCKET)/ 创建 Socket 失败printf(socket failed with error : %dn,WSAGetLastError();rlt = 2;return rlt;/ 目标服务器数据 sockaddr_in sockaddrServer;sockaddrServer.sin_family = AF_INET; sockaddrServer
11、.sin_port = port;sockaddrServer.sin_addr.s_addr = inet_addr(address);/ 连接 ,sock 与目标服务器连接iErrMsg = connect(m_sock,(sockaddr*)&sockaddrServer,sizeof(sockaddrServer); if (iErrMsg 0)printf(connect failed with error : %dn,iErrMsg);rlt = 3;return rlt;return rlt;int CClientNet:SendMsg(const char* msg,int l
12、en)int rlt = 0;int iErrMsg = 0;/ 发送消息,指定 sock 发送消息 iErrMsg = send(m_sock,msg,len,0);if (iErrMsg 0)/ 发送失败 printf(send msg failed with error : %dn,iErrMsg);rlt = 1; return rlt;return rlt;void CClientNet:Close() closesocket(m_sock);int main()CClientNet client;/ 连接到 127.0.0.1 (即本地) ,端口号为 8888 的服务端 print
13、f(Connectn);client.Connect(8888,127.0.0.1);/ 发送消息 printf(send msgn);client.SendMsg(hello0,sizeof(hello0);/ 关闭 socket printf(closen);client.Close();system(pause);四实验结果 F笛畫二诂乂匕州.査飞亡厲弐7严刊亍Socket 在通信虽然程序是五心得体会通过本次实验, 我了解了 TCP/IP 协议与 UDP 协议的异同之处, 理解了中的地位和作用。 在调试程序过程中的查错纠错也让我对程序有了深刻的理解,借鉴他人的,但我通过调试之后的进一步解析阅读也掌握了其中的原理,收获颇丰。