C++代码
  1. //Filename: TcpServerClass.cpp  
  2.   
  3. #include "TcpServerClass.hpp"  
  4.   
  5. TcpServer::TcpServer(int listen_port)  
  6. {  
  7.     if ( (listenSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) {  
  8.         throw "socket() failed";  
  9.     }  
  10.   
  11.     memset(&servAddr, 0, sizeof(servAddr));  
  12.     servAddr.sin_family = AF_INET;  
  13.     servAddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  14.     servAddr.sin_port = htons(listen_port);  
  15.   
  16.     if ( bind(listenSock, (sockaddr*)&servAddr, sizeof(servAddr)) < 0 ) {  
  17.         throw "bind() failed";  
  18.     }  
  19.   
  20.     if ( listen(listenSock, 10) < 0 ) {  
  21.         throw "listen() failed";  
  22.     }  
  23. }  
  24.   
  25. bool TcpServer::isAccept()  
  26. {  
  27.     unsigned int clntAddrLen = sizeof(clntAddr);  
  28.   
  29.     if ( (communicationSock = accept(listenSock, (sockaddr*)&clntAddr, &clntAddrLen)) < 0 ) {  
  30.         return false;  
  31.     } else {  
  32.         std::cout << "Client(IP: " << inet_ntoa(clntAddr.sin_addr) << ") connected.\n";  
  33.         return true;  
  34.     }  
  35. }  
  36.   
  37. void TcpServer::handleEcho()  
  38. {  
  39.     const int BUFFERSIZE = 32;  
  40.     char buffer[BUFFERSIZE];  
  41.     int recvMsgSize;  
  42.     bool goon = true;  
  43.   
  44.     while ( goon == true ) {  
  45.         if ( (recvMsgSize = recv(communicationSock, buffer, BUFFERSIZE, 0)) < 0 ) {  
  46.             throw "recv() failed";  
  47.         } else if ( recvMsgSize == 0 ) {  
  48.             goon = false;  
  49.         } else {  
  50.             if ( send(communicationSock, buffer, recvMsgSize, 0) != recvMsgSize ) {  
  51.                 throw "send() failed";  
  52.             }  
  53.         }  
  54.     }  
  55.   
  56.     close(communicationSock);  
  57. }  
C++代码
  1. //Filename: TcpServerClass.hpp  
  2.   
  3. #ifndef TCPSERVERCLASS_HPP_INCLUDED  
  4. #define TCPSERVERCLASS_HPP_INCLUDED  
  5.   
  6. #include <unistd.h>  
  7. #include <iostream>  
  8. #include <sys/socket.h>  
  9. #include <arpa/inet.h>  
  10.   
  11. class TcpServer  
  12. {  
  13. private:  
  14.     int listenSock;  
  15.     int communicationSock;  
  16.     sockaddr_in servAddr;  
  17.     sockaddr_in clntAddr;  
  18. public:  
  19.     TcpServer(int listen_port);  
  20.     bool isAccept();  
  21.     void handleEcho();  
  22. };  
  23.   
  24.   
  25. #endif // TCPSERVERCLASS_HPP_INCLUDED  

        演示程序:

C++代码
  1. //Filename: main.cpp  
  2. //Tcp Server C++ style, single work  
  3.   
  4. #include <iostream>  
  5. #include "TcpServerClass.hpp"  
  6.   
  7. int echo_server(int argc, char* argv[]);  
  8.   
  9. int main(int argc, char* argv[])  
  10. {  
  11.     int mainRtn = 0;  
  12.     try {  
  13.         mainRtn = echo_server(argc, argv);  
  14.     }  
  15.     catch ( const char* s ) {  
  16.         perror(s);  
  17.         exit(EXIT_FAILURE);  
  18.     }  
  19.   
  20.     return mainRtn;  
  21. }  
  22.   
  23. int echo_server(int argc, char* argv[])  
  24. {  
  25.     int port;  
  26.     if ( argc == 2 ) {  
  27.         port = atoi(argv[1]);  
  28.     } else {  
  29.         port = 5000;  
  30.     }  
  31.   
  32.     TcpServer myServ(port);  
  33.   
  34.     while ( true ) {  
  35.         if ( myServ.isAccept() == true ) {  
  36.             myServ.handleEcho();  
  37.         }  
  38.     }  
  39.   
  40.     return 0;  
  41. }  
除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.teaching4real.com/software/417.html
2015年8月11日
作者:鸡啄米 分类:软件开发 浏览: 注册送白菜网:1