电子科大李老师Linux实验三.doc_第1页
电子科大李老师Linux实验三.doc_第2页
电子科大李老师Linux实验三.doc_第3页
电子科大李老师Linux实验三.doc_第4页
电子科大李老师Linux实验三.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:李林实验地点: 实验时间:Csdn全部资源下载地址:/detail/siieghqfn/9616285一、实验室名称:Linux环境高级编程实验室二、实验项目名称:基本TCP套接口通信库封装三、实验学时:8学时四、实验目的:需要说明为什么要进行本次实验五、实验内容:对基本TCP套接口通信机制进行封装。要求使用以下五种编程范式,封装通信库;并使用五种封装后通信库,实现echo服务器和客户端。l 传统C的结构化程序设计思想服务端代码,TCPServer.cpp:#include #include #include #include #include /定义一个函数指针类型typedef void (* PServerFunc)(int nConnectedSocket, int nListenSocket);/* 传统的结构化形式封装的TCP服务端 ServerFunction为需要回调的通信函数 nPort为需要绑定的端口号 nLengthOfQueueOfListen为监听队列长度,默认值100 strBoundIP为需要绑定的IP*/int StartTCPServer(PServerFunc ServerFunction, int nPort, int nLengthOfQueueOfListen = 100, const char *strBoundIP = NULL) /创建一个TCP套接字用于监听 int nListenSocket = :socket(AF_INET, SOCK_STREAM, 0); if(-1 = nListenSocket) /创建失败就提示并返回 std:cout Create Socket failed! std:endl; return -1; /创建一个用来绑定的地址结构体 sockaddr_in ServerAddress; /先整个填充0,等于设置默认值 memset(&ServerAddress, 0, sizeof(sockaddr_in); /设置地址族为IPv4 ServerAddress.sin_family = AF_INET; if(NULL = strBoundIP) /没有传递要绑定的IP /设置默认绑定地址为任意本地地址 ServerAddress.sin_addr.s_addr = htonl(INADDR_ANY); else /将点分十进制的IP转换到二进制 if(:inet_pton(AF_INET, strBoundIP, &ServerAddress.sin_addr) != 1) std:cout Inet_pton failed! std:endl; :close(nListenSocket); return -1; /转换端口号为网络字节序并填充到地址结构 ServerAddress.sin_port = htons(nPort); /绑定IP和端口 if(:bind(nListenSocket, (sockaddr *)&ServerAddress, sizeof(sockaddr_in) = -1) std:cout Bind failed! std:endl; :close(nListenSocket); return -1; /开始监听连接请求 std:cout Server listening. std:endl; if(:listen(nListenSocket, nLengthOfQueueOfListen) = -1) std:cout Listen failed! std:endl; :close(nListenSocket); return -1; /创建一个用于接收客户端地址信息的结构体 sockaddr_in ClientAddress; socklen_t LengthOfClientAddress = sizeof(sockaddr_in); /接受一个连接请求,得到已连接的套接字nConnectedSocket int nConnectedSocket = :accept(nListenSocket, (sockaddr *)&ClientAddress, &LengthOfClientAddress); if(-1 = nConnectedSocket) /返回-1说明连接失败 std:cout Accept failed! std:endl; :close(nListenSocket); return -1; ServerFunction(nConnectedSocket, nListenSocket); /回调用户传入的通信函数 :close(nConnectedSocket); /关闭连接套接字 :close(nListenSocket); /关闭监听套接字 return 0;/自定义的通信函数void MyServerFunc(int nConnectedSocket, int nListenSocket) :write(nConnectedSocket, Hello Worldn, 13);/主函数,程序入口,测试代码int main() /启动TCP服务端,传入自定义的通信函数的指针,以及要绑定的端口4000 StartTCPServer(MyServerFunc, 4000); return 0;客户端代码,TCPClient.cpp:#include #include #include #include #include #include /定义一个函数指针类型typedef void (* PClientFunc)(int nConnectedSocket);/* 传统的结构化形式封装的TCP客户端 ClientFunction为需要回调的通信函数 nServerPort为要连接的服务端端口号 strServerIP为要连接的服务端IP*/int StartTCPClient(PClientFunc ClientFunction, int nServerPort, const char *strServerIP) /创建一个TCP套接字用于发起连接 int nClientSocket = :socket(AF_INET, SOCK_STREAM, 0); if(-1 = nClientSocket) /创建失败 std:cout Create Socket failed! std:endl; return -1; /创建一个用来连接服务端的地址结构体 sockaddr_in ServerAddress; /先整个填充0,等于设置默认值 memset(&ServerAddress, 0, sizeof(sockaddr_in); /设置地址族为IPv4 ServerAddress.sin_family = AF_INET; /将点分十进制的IP转换到二进制 if(:inet_pton(AF_INET, strServerIP, &ServerAddress.sin_addr) != 1) std:cout Inet_pton failed! std:endl; :close(nClientSocket); return -1; /转换端口号为网络字节序并填充到地址结构 ServerAddress.sin_port = htons(nServerPort); /连接到服务端 if(:connect(nClientSocket, (sockaddr*)&ServerAddress, sizeof(ServerAddress) = -1) std:cout Connect to server failed std:endl; :close(nClientSocket); return -1; ClientFunction(nClientSocket); /回调用户传入的通信函数 /最后关闭套接字 :close(nClientSocket); return 0;/自定义的通信函数void MyClientFunc(int nConnectedSocket) /定义一个缓冲区 char buf13; /读取服务端发送来的数据 :read(nConnectedSocket, buf, 13);/输出 std:cout buf std:endl;/主函数,程序入口,测试代码int main() /启动TCP客户端,传入自定义的通信函数的指针,以及服务端的端口和IP StartTCPClient(MyClientFunc, 4000, ); return 0;Makefile文件:TCP : TCPServer.cpp TCPClient.cppg+ -o TCPServer TCPServer.cpp -gg+ -o TCPClient TCPClient.cpp g编译:先启动服务端,进入监听状态另开一终端,启动客户端去连接,并获取服务端返回的消息l 面向对象的程序设计思想服务端代码,TCPServer.cpp#include #include #include #include #include #include /* 基于面向对象形式封装的TCP服务端类*/class CTCPServerpublic: /* 构造函数 nServerPort为需要绑定的端口号 nLengthOfQueueOfListen为监听队列长度,默认值100 strBoundIP为需要绑定的IP */ CTCPServer(int nServerPort, int nLengthOfQueueOfListen = 100, const char *strBoundIP = NULL) /把参数赋值给成员变量 m_nServerPort = nServerPort; m_nLengthOfQueueOfListen = nLengthOfQueueOfListen; if(NULL = strBoundIP) /没有传IP参数 m_strBoundIP = NULL; else /传了 /字符数组拷贝,复制IP到成员变量 int length = strlen(strBoundIP); m_strBoundIP = new charlength + 1; memcpy(m_strBoundIP, strBoundIP, length + 1); virtual CTCPServer() /析构函数 if(m_strBoundIP != NULL) /释放动态分配的内存 delete m_strBoundIP; /公有成员方法定义public: /启动服务端 int Start() /创建一个TCP套接字用于监听 int nListenSocket = :socket(AF_INET, SOCK_STREAM, 0); if(-1 = nListenSocket) /创建失败就提示并返回 std:cout Create Socket failed! std:endl; return -1; /创建一个用来绑定的地址结构体 sockaddr_in ServerAddress; /先整个填充0,等于设置默认值 memset(&ServerAddress, 0, sizeof(sockaddr_in); /设置地址族为IPv4 ServerAddress.sin_family = AF_INET; if(NULL = m_strBoundIP) /没有传递要绑定的IP /设置默认绑定地址为任意本地地址 ServerAddress.sin_addr.s_addr = htonl(INADDR_ANY); else /将点分十进制的IP转换到二进制 if(:inet_pton(AF_INET, m_strBoundIP, &ServerAddress.sin_addr) != 1) std:cout Inet_pton failed! std:endl; :close(nListenSocket); return -1; /转换端口号为网络字节序并填充到地址结构 ServerAddress.sin_port = htons(m_nServerPort); /绑定IP和端口 if(:bind(nListenSocket, (sockaddr *)&ServerAddress, sizeof(sockaddr_in) = -1) std:cout Bind failed! std:endl; :close(nListenSocket); return -1; /开始监听连接请求 std:cout Server listening. std:endl; if(:listen(nListenSocket, m_nLengthOfQueueOfListen) = -1) std:cout Listen failed! std:endl; :close(nListenSocket); return -1; /创建一个用于接收客户端地址信息的结构体 sockaddr_in ClientAddress; socklen_t LengthOfClientAddress = sizeof(sockaddr_in); /接受一个连接请求,得到已连接的套接字nConnectedSocket int nConnectedSocket = :accept(nListenSocket, (sockaddr *)&ClientAddress, &LengthOfClientAddress); if(-1 = nConnectedSocket) std:cout Accept failed! std:endl; :close(nListenSocket); return -1; ServerFunction(nConnectedSocket, nListenSocket); /调用通信函数 :close(nConnectedSocket); /关闭连接套接字 :close(nListenSocket); /关闭监听套接字 return 0; private: /虚函数,可以在子类覆盖的通信函数 virtual void ServerFunction(int nConnectedSocket, int nListenSocket) /私有成员变量private: int m_nServerPort; /端口 char* m_strBoundIP; /IP int m_nLengthOfQueueOfListen; /监听队列长度;/* 自定义一个继承自TCP封装类的测试类*/class CMyTCPServer : public CTCPServerpublic: CMyTCPServer(int nServerPort, int nLengthOfQueueOfListen = 100, const char *strBoundIP = NULL) : CTCPServer(nServerPort, nLengthOfQueueOfListen, strBoundIP) virtual CMyTCPServer() private: /覆盖通信函数,发送“Hello World” virtual void ServerFunction(int nConnectedSocket, int nListenSocket) :write(nConnectedSocket, Hello Worldn, 13); ;/主函数,程序入口,测试代码int main() /创建一个测试类对象 CMyTCPServer myserver(4000); /启动服务端 myserver.Start(); return 0;客户端代码,TCPClient.cpp#include #include #include #include #include #include #include /* 基于面向对象形式封装的TCP客户端类*/class CTCPClientpublic: /* 构造函数 nServerPort为要连接的服务端端口号 strServerIP为要连接的服务端IP */ CTCPClient(int nServerPort, const char *strServerIP) /把参数赋值给成员变量 m_nServerPort = nServerPort; /字符数组拷贝,复制IP到成员变量 int nlength = strlen(strServerIP); m_strServerIP = new char nlength + 1; strcpy(m_strServerIP, strServerIP); virtual CTCPClient() /析构函数 /释放动态分配的内存 delete m_strServerIP; /公有成员方法定义public: /启动客户端 int Start() /创建一个TCP套接字用于发起连接 int nClientSocket = :socket(AF_INET, SOCK_STREAM, 0); if(-1 = nClientSocket) /创建失败 std:cout Create Socket failed! std:endl; return -1; /创建一个用来连接服务端的地址结构体 sockaddr_in ServerAddress; /先整个填充0,等于设置默认值 memset(&ServerAddress, 0, sizeof(sockaddr_in); /设置地址族为IPv4 ServerAddress.sin_family = AF_INET; /将点分十进制的IP转换到二进制 if(:inet_pton(AF_INET, m_strServerIP, &ServerAddress.sin_addr) != 1) std:cout Inet_pton failed! std:endl; :close(nClientSocket); return -1; /转换端口号为网络字节序并填充到地址结构 ServerAddress.sin_port = htons(m_nServerPort); /连接到服务端 if(:connect(nClientSocket, (sockaddr*)&ServerAddress, sizeof(ServerAddress) = -1) std:cout Connect to server failed std:endl; :close(nClientSocket); return -1; ClientFunction(nClientSocket); /调用通信函数 /最后关闭套接字 :close(nClientSocket); return 0; /虚函数,可以在子类覆盖的通信函数 virtual void ClientFunction(int nConnectedSocket) /私有成员变量private: int m_nServerPort; /要连接的服务端端口号 char *m_strServerIP; /要连接的服务端IP;/* 自定义一个继承自TCP封装类的测试类*/class CMyTCPClient : public CTCPClientpublic: CMyTCPClient(int nServerPort, const char *strServerIP) : CTCPClient(nServerPort, strServerIP) virtual CMyTCPClient() private: /覆盖通信函数 virtual void ClientFunction(int nConnectedSocket) /定义一个缓冲区 char buf13; /读取服务端发送来的数据 :read(nConnectedSocket, buf, 13); /输出 std:cout buf std:endl; ;/主函数,程序入口,测试代码int main() /创建一个测试类对象,参数为服务端的端口和IP CMyTCPClient client(4000, ); /启动客户端 client.Start(); return 0;Makefile文件:TCP : TCPServer.cpp TCPClient.cppg+ -o TCPServer TCPServer.cpp -gg+ -o TCPClient TCPClient.cpp g编译:先启动服务端,开始监听:另开一终端,启动客户端去连接,并获取服务端返回的消息l 基于接口的程序设计思想服务端代码,TCPServer.cpp#include #include #include #include #include #include /用于回调通信函数的服务端接口类class CTCPServerObserverpublic: CTCPServerObserver() virtual CTCPServerObserver() public: /虚函数,声明通信函数,在子类中实现它 virtual void ServerFunction(int nConnectedSocket, int nListenSocket) = 0;/* 基于面向对象形式封装的TCP服务端类*/class CTCPServerpublic: /* 构造函数 pObserver为被回调通信函数的对象 nServerPort为需要绑定的端口号 nLengthOfQueueOfListen为监听队列长度,默认值100 strBoundIP为需要绑定的IP */ CTCPServer(CTCPServerObserver *pObserver, int nServerPort, int nLengthOfQueueOfListen = 100, const char *strBoundIP = NULL) /把参数赋值给成员变量 m_pObserver = pObserver; m_nServerPort = nServerPort; m_nLengthOfQueueOfListen = nLengthOfQueueOfListen; if(NULL = strBoundIP) /没有传IP参数 m_strBoundIP = NULL; else /传了 /字符数组拷贝,复制IP到成员变量 int length = strlen(strBoundIP); m_strBoundIP = new charlength + 1; memcpy(m_strBoundIP, strBoundIP, length + 1); virtual CTCPServer() /析构函数 if(m_strBoundIP != NULL) /释放动态分配的内存 delete m_strBoundIP; /公有成员方法定义public: /启动服务端 int Start() /创建一个TCP套接字用于监听 int nListenSocket = :socket(AF_INET, SOCK_STREAM, 0); if(-1 = nListenSocket) /创建失败就提示并返回 std:cout Create Socket failed! std:endl; return -1; /创建一个用来绑定的地址结构体 sockaddr_in ServerAddress; /先整个填充0,等于设置默认值 memset(&ServerAddress, 0, sizeof(sockaddr_in); /设置地址族为IPv4 ServerAddress.sin_family = AF_INET; if(NULL = m_strBoundIP) /没有传递要绑定的IP /设置默认绑定地址为任意本地地址 ServerAddress.sin_addr.s_addr = htonl(INADDR_ANY); else /将点分十进制的IP转换到二进制 if(:inet_pton(AF_INET, m_strBoundIP, &ServerAddress.sin_addr) != 1) std:cout Inet_pton failed! std:endl; :close(nListenSocket); return -1; /转换端口号为网络字节序并填充到地址结构 ServerAddress.sin_port = htons(m_nServerPort); /绑定IP和端口 if(:bind(nListenSocket, (sockaddr *)&ServerAddress, sizeof(sockaddr_in) = -1) std:cout Bind failed! std:endl; :close(nListenSocket); return -1; /开始监听连接请求 if(:listen(nListenSocket, m_nLengthOfQueueOfListen) = -1) std:cout Listen failed! std:endl; :close(nListenSocket); return -1; /创建一个用于接收客户端地址信息的结构体 sockaddr_in ClientAddress; socklen_t LengthOfClientAddress = sizeof(sockaddr_in); /接受一个连接请求,得到已连接的套接字nConnectedSocket int nConnectedSocket = :accept(nListenSocket, (sockaddr *)&ClientAddress, &LengthOfClientAddress); if(-1 = nConnectedSocket) std:cout Accept failed! ServerFunction(nConnectedSocket, nListenSocket); :close(nConnectedSocket); /关闭连接套接字 :close(nListenSocket); /关闭监听套接字 return 0; /私有成员变量private: int m_nServerPort;/端口 char* m_strBoundIP; /IP int m_nLengthOfQueueOfListen; /监听队列长度 CTCPServerObserver* m_pObserver; /被回调的接口对象;/* 自定义一个继承自CTCPServerObserver回调接口的测试类*/class CMyTCPServer : public CTCPServerObserverpublic: CMyTCPServer() virtual CMyTCPServer() private: /实现通信函数,发送“Hello World” virtual void ServerFunction(int nConnectedSocket, int nListenSocket) :write(nConnectedSocket, Hello Worldn, 13); ;/主函数,程序入口,测试代码int main() /创建一个测试类对象 CMyTCPServer myserver; /创建一个TCP服务对象,传入实现了接口的测试类对象 CTCPServer tcpserver(&myserver, 4000); /启动服务端 tcpserver.Start(); return 0;客户端代码,TCPClient.cpp#include #include #include #include #include #include #include /用于回调通信函数的客户端接口类class CTCPClientObserverpublic: CTCPClientObserver() virtual CTCPClientObserver() public: /虚函数,声明通信函数,在子类中实现它 virtual void ClientFunction(int nConnectedSocket) = 0;/* 基于面向对象形式封装的TCP客户端类*/class CTCPClientpublic: /* 构造函数 pObserver为被回调通信函数的对象 nServerPort为要连接的服务端端口号 strServerIP为要连接的服务端IP */ CTCPClient(CTCPClientObserver *pObserver, int nServerPort, const char *strServerIP) /把参数赋值给成员变量 m_

温馨提示

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

评论

0/150

提交评论