您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 电子科大李老师Linux实验三
电子科技大学实验报告学生姓名:学号:指导教师:李林实验地点:实验时间:Csdn全部资源下载地址:一、实验室名称:Linux环境高级编程实验室二、实验项目名称:基本TCP套接口通信库封装三、实验学时:8学时四、实验目的:需要说明为什么要进行本次实验五、实验内容:对基本TCP套接口通信机制进行封装。要求使用以下五种编程范式,封装通信库;并使用五种封装后通信库,实现echo服务器和客户端。传统C的结构化程序设计思想服务端代码,TCPServer.cpp:#includenetinet/in.h#includearpa/inet.h#includememory.h#includeunistd.h#includeiostream//定义一个函数指针类型typedefvoid(*PServerFunc)(intnConnectedSocket,intnListenSocket);/**传统的结构化形式封装的TCP服务端ServerFunction为需要回调的通信函数nPort为需要绑定的端口号nLengthOfQueueOfListen为监听队列长度,默认值100strBoundIP为需要绑定的IP*/intStartTCPServer(PServerFuncServerFunction,intnPort,intnLengthOfQueueOfListen=100,constchar*strBoundIP=NULL){//创建一个TCP套接字用于监听intnListenSocket=::socket(AF_INET,SOCK_STREAM,0);if(-1==nListenSocket)//创建失败就提示并返回{std::coutCreateSocketfailed!std::endl;return-1;}//创建一个用来绑定的地址结构体sockaddr_inServerAddress;//先整个填充0,等于设置默认值memset(&ServerAddress,0,sizeof(sockaddr_in));//设置地址族为IPv4ServerAddress.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::coutInet_ptonfailed!std::endl;::close(nListenSocket);return-1;}}//转换端口号为网络字节序并填充到地址结构ServerAddress.sin_port=htons(nPort);//绑定IP和端口if(::bind(nListenSocket,(sockaddr*)&ServerAddress,sizeof(sockaddr_in))==-1){std::coutBindfailed!std::endl;::close(nListenSocket);return-1;}//开始监听连接请求std::coutServerlistening...std::endl;if(::listen(nListenSocket,nLengthOfQueueOfListen)==-1){std::coutListenfailed!std::endl;::close(nListenSocket);return-1;}//创建一个用于接收客户端地址信息的结构体sockaddr_inClientAddress;socklen_tLengthOfClientAddress=sizeof(sockaddr_in);//接受一个连接请求,得到已连接的套接字nConnectedSocketintnConnectedSocket=::accept(nListenSocket,(sockaddr*)&ClientAddress,&LengthOfClientAddress);if(-1==nConnectedSocket)//返回-1说明连接失败{std::coutAcceptfailed!std::endl;::close(nListenSocket);return-1;}ServerFunction(nConnectedSocket,nListenSocket);//回调用户传入的通信函数::close(nConnectedSocket);//关闭连接套接字::close(nListenSocket);//关闭监听套接字return0;}//自定义的通信函数voidMyServerFunc(intnConnectedSocket,intnListenSocket){::write(nConnectedSocket,HelloWorld\n,13);}//主函数,程序入口,测试代码intmain(){//启动TCP服务端,传入自定义的通信函数的指针,以及要绑定的端口4000StartTCPServer(MyServerFunc,4000);return0;}客户端代码,TCPClient.cpp:#includesys/socket.h#includenetinet/in.h#includememory.h#includearpa/inet.h#includeunistd.h#includeiostream//定义一个函数指针类型typedefvoid(*PClientFunc)(intnConnectedSocket);/**传统的结构化形式封装的TCP客户端ClientFunction为需要回调的通信函数nServerPort为要连接的服务端端口号strServerIP为要连接的服务端IP*/intStartTCPClient(PClientFuncClientFunction,intnServerPort,constchar*strServerIP){//创建一个TCP套接字用于发起连接intnClientSocket=::socket(AF_INET,SOCK_STREAM,0);if(-1==nClientSocket)//创建失败{std::coutCreateSocketfailed!std::endl;return-1;}//创建一个用来连接服务端的地址结构体sockaddr_inServerAddress;//先整个填充0,等于设置默认值memset(&ServerAddress,0,sizeof(sockaddr_in));//设置地址族为IPv4ServerAddress.sin_family=AF_INET;//将点分十进制的IP转换到二进制if(::inet_pton(AF_INET,strServerIP,&ServerAddress.sin_addr)!=1){std::coutInet_ptonfailed!std::endl;::close(nClientSocket);return-1;}//转换端口号为网络字节序并填充到地址结构ServerAddress.sin_port=htons(nServerPort);//连接到服务端if(::connect(nClientSocket,(sockaddr*)&ServerAddress,sizeof(ServerAddress))==-1){std::coutConnecttoserverfailedstd::endl;::close(nClientSocket);return-1;}ClientFunction(nClientSocket);//回调用户传入的通信函数//最后关闭套接字::close(nClientSocket);return0;}//自定义的通信函数voidMyClientFunc(intnConnectedSocket){//定义一个缓冲区charbuf[13];//读取服务端发送来的数据::read(nConnectedSocket,buf,13);//输出std::coutbufstd::endl;}//主函数,程序入口,测试代码intmain(){//启动TCP客户端,传入自定义的通信函数的指针,以及服务端的端口和IPStartTCPClient(MyClientFunc,4000,127.0.0.1);return0;}Makefile文件:TCP:TCPServer.cppTCPClient.cppg++-oTCPServerTCPServer.cpp-gg++-oTCPClientTCPClient.cpp–g编译:先启动服务端,进入监听状态另开一终端,启动客户端去连接,并获取服务端返回的消息面向对象的程序设计思想服务端代码,TCPServer.cpp#includenetinet/in.h#includearpa/inet.h#includememory.h#includestring.h#includeunistd.h#includeiostream/**基于面向对象形式封装的TCP服务端类*/classCTCPServer{public:/**构造函数nServerPort为需要绑定的端口号nLengthOfQueueOfListen为监听队列长度,默认值100strBoundIP为需要绑定的IP*/CTCPServer(intnServerPort,intnLengthOfQueueOfListen=100,constchar*strBoundIP=NULL){//把参数赋值给成员变量m_nServerPort=nServerPort;m_nLengthOfQueueOfListen=nLengthOfQueueOfListen;if(NULL==strBoundIP)//没有传IP参数{m_strBoundIP=NULL;}else//传了{//字符数组拷贝,复制IP到成员变量intlength=strlen(strBoundIP);m_strBoundIP=newchar[length+1];memcpy(m_strBoundIP,strBoundIP,length+1);}}virtual~CTCPServer()//析构函数{if(m_strBoundIP!=NULL){//释放动态分配的内存delete[]m_strBoundIP;}}//公有成员方法定义public://启动服务端intStart(){//创建一个TCP套接字用于监听intnListenSocket=::socket(AF_INET,SOCK_STREAM,0);if(-1==nListenSocket)//创建失败就提示并返回{std::coutCreateSocketfailed!std::endl;return-1;}//创建一个用来绑定的地址结构体sockaddr_inServerAddress;//先整个填充0,等于设置默认值memset(&ServerAddress,0,sizeof(sockaddr_in));//设置地址族为IPv4ServerAddress.sin_family=AF_INET;if(NULL==m_strBoundIP)//没有传递要绑定的IP{//设置默认绑定地址为任意本地地址ServerAddress.sin_addr.s_addr=htonl(INADDR_ANY);}else{//将点分十进制的IP转换到二进制if(::inet_pt
本文标题:电子科大李老师Linux实验三
链接地址:https://www.777doc.com/doc-8590792 .html