linux下C++SocketTCP编程---服务器端

来源:互联网 发布:如何建立网络链接 编辑:程序博客网 时间:2024/06/08 06:38

NetServer.h

[cpp] view plaincopy
  1. #ifndef NETSERVER_H_  
  2. #define NETSERVER_H_  
  3.   
  4. #include <stdio.h>  
  5. #include <stdlib.h>  
  6. #include <errno.h>  
  7. #include <string.h>  
  8. #include <sys/types.h>  
  9. #include <sys/socket.h>  
  10. #include <sys/wait.h>  
  11. #include <unistd.h>  
  12. #include <arpa/inet.h>  
  13. #include <sys/ioctl.h>  
  14. #include <iostream>  
  15. using namespace std;  
  16. class NetServer {  
  17. public:  
  18.     NetServer();  
  19.     virtual ~NetServer();  
  20.     void CreateConnect();  
  21.     void CheckConnect();  
  22.     void RevHello(char* str,int para[]);  
  23.     void SendHelloToo();  
  24. protected:  
  25.     void AcceptConnect();  
  26.     void HandlePacket();  
  27.     bool CheckBuff(char* str,int num);  
  28.     void DividePacket(char* str);  
  29.     void HandlePacketHead(char** str,int param[]);  
  30.     void SendPacket(string str);  
  31. private:  
  32. #define MAXBUF 1024  
  33.     char buff[MAXBUF];  
  34.     int sockfd,clientfd;  
  35.     sockaddr_in clientAddr;  
  36.     socklen_t len;  
  37.     bool connectFlag;  
  38. };  
  39. #endif /* NETSERVER_H_ */  


NetServer.cpp

[cpp] view plaincopy
  1. #include "NetServer.h"  
  2.   
  3. #define defPort 7788  
  4. NetServer::NetServer()  
  5. {  
  6. }  
  7. NetServer::~NetServer()  
  8. {  
  9.     close(sockfd);  
  10. }  
  11. void NetServer::CreateConnect()  
  12. {  
  13.     sockaddr_in serverAddr;  
  14.     connectFlag=false;  
  15.     if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1)  
  16.     {  
  17.         printf("socket created failly,errno=%d,errorInfo: %s\n",errno,strerror(errno));  
  18.         exit(1);  
  19.     }  
  20.     else  
  21.         printf("socket created successfully\n");  
  22.   
  23.     bzero(&serverAddr,sizeof(serverAddr));  
  24.     serverAddr.sin_family=PF_INET;  
  25.     serverAddr.sin_port=htons(defPort);  
  26.     serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);  
  27.   
  28.     if(bind(sockfd,(sockaddr*)&serverAddr,sizeof(sockaddr))==-1)  
  29.     {  
  30.         printf("bind failly,errno=%d,errorInfo: %s\n",errno,strerror(errno));  
  31.         exit(1);  
  32.     }  
  33.     else  
  34.         printf("bind successfully\n");  
  35.     if(listen(sockfd,10)==-1)  
  36.     {  
  37.         printf("listen failly,errno=%d,errorInfo: %s\n",errno,strerror(errno));  
  38.         exit(1);  
  39.     }  
  40.     else  
  41.         printf("listen successfully\n");  
  42.   
  43.     len=sizeof(struct sockaddr);  
  44.     int b_on = 1;  
  45.     ioctl (sockfd, FIONBIO, &b_on);  
  46. }  
  47. void NetServer::CheckConnect()  
  48. {  
  49.     if(connectFlag)  
  50.         HandlePacket();  
  51.     else  
  52.         AcceptConnect();  
  53. }  
  54. void NetServer::AcceptConnect()  
  55. {  
  56.     clientfd=accept(sockfd,(sockaddr*)&clientAddr,&len);  
  57.     if(clientfd==-1)  
  58.     {  
  59.         connectFlag=false;  
  60.         printf("accept failly,errno=%d,errorInfo: %s\n",errno,strerror(errno));  
  61.     }  
  62.     else  
  63.     {  
  64.         connectFlag=true;  
  65.         printf("server:got connection from %s,port %d,socket %d\n",inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port), clientfd);  
  66.         long b_on = 1;  
  67.         ioctl (clientfd, FIONBIO, &b_on);  
  68.     }  
  69. }  
  70. void NetServer::HandlePacket()  
  71. {  
  72.     char buff[MAXBUF];  
  73.     bzero(buff,MAXBUF);  
  74.     int res=recv(clientfd,buff,MAXBUF,0);  
  75.     if(res!=-1)  
  76.     {  
  77.         if(CheckBuff(buff,res))  
  78.             DividePacket(buff);  
  79.         else  
  80.             cout<<"\""<<buff<<"\""<<"  has illegal data!!!"<<endl;  
  81.     }  
  82.     else  
  83.         printf("recv failly,errno=%d,errorInfo: %s\n",errno,strerror(errno));  
  84. }  
  85. bool NetServer::CheckBuff(char* str,int num)  
  86. {  
  87.     //合法字符只有空格(32),_ (95)小写字母(97~122)和数字(48~57)  
  88.     for(int i=0;i<num;i++)  
  89.     {  
  90.         if(str[i]==32||str[i]==95)  
  91.             continue;  
  92.         else if(str[i]>=97&&str[i]<=122)  
  93.             continue;  
  94.         else if(str[i]>=48&&str[i]<=57)  
  95.             continue;  
  96.         else  
  97.             return false;  
  98.     }  
  99.     return true;  
  100. }  
  101. void NetServer::DividePacket(char* paraStr)  
  102. {  
  103.     char* strPtr[10];  
  104.     int paraList[10][10];  
  105.     for(int i=0;i<10;i++)  
  106.     {  
  107.         strPtr[i]=NULL;  
  108.         for(int j=0;j<10;j++)  
  109.         {  
  110.             paraList[i][j]='|';  
  111.         }  
  112.     }  
  113.     char* subStr=strtok(paraStr," ");  
  114.     int i=0,j=0;  
  115.     while(subStr!=NULL)  
  116.     {  
  117.         if(*subStr>=48 && *subStr<=57)  
  118.         {  
  119.             paraList[i-1][j]=atoi(subStr);  
  120.             cout<<"subdata: "<<subStr<<" paraList["<<i<<"]["<<j<<"]="<<paraList[i-1][j]<<endl;  
  121.             j++;  
  122.         }  
  123.         else  
  124.         {  
  125.             strPtr[i]=subStr;  
  126.             i++;  
  127.             j=0;  
  128.         }  
  129.         subStr=strtok(NULL," ");  
  130.     }  
  131.     for(int i=0;i<10;i++)  
  132.     {  
  133.         if(strPtr[i])  
  134.         {  
  135.             HandlePacketHead(strPtr+i,paraList[i]);  
  136.         }  
  137.     }  
  138. }  
  139. void NetServer::HandlePacketHead(char** str,int param[])  
  140. {  
  141.     if(strcmp(*str,"hello")==0)  
  142.     {  
  143.         RevHello(*str,param);  
  144.     }  
  145.     else if(strcmp(*str,"thankyou")==0)  
  146.     {  
  147.         cout<<"thankyou---------"<<param[0]<<endl;  
  148.     }  
  149.     else  
  150.     {  
  151.         cout<<"not useful info: "<<*str<<" para: "<<*param<<endl;  
  152.     }  
  153. }  
  154. void NetServer::RevHello(char* str,int para[])  
  155. {  
  156.     cout<<"receive:   "<<str<<" ";  
  157.     for(int i=0;i<10;i++)  
  158.     {  
  159.         if(para[i]!='|')// '|'==124  
  160.             cout<<para[i]<<" ";  
  161. //      else  
  162. //          cout<<"!!!"<<para[i]<<" ";  
  163.     }  
  164.     cout<<endl;  
  165.     cout<<"\ntwo para="<<para[1]<<endl;  
  166.     if(para[0]==1989)  
  167.         SendHelloToo();  
  168. }  
  169. void NetServer::SendPacket(string str)  
  170. {  
  171.     char buff[MAXBUF];  
  172.     bzero(buff,MAXBUF);  
  173.     strcpy(buff,str.data());  
  174.     int len=send(clientfd,buff,strlen(buff),0);  
  175.     if(len==-1)  
  176.         printf("send failly,errno=%d,errorInfo:%s",errno,strerror(errno));  
  177.     else  
  178.         printf("send successfully,InfoLen=%d,Info: '%s'.\n",len,buff);  
  179. }  
  180. void NetServer::SendHelloToo()  
  181. {  
  182.     SendPacket("women 789");  
  183. }  
  184. int main()  
  185. {  
  186.     NetServer NS;  
  187.     NS.CreateConnect();  
  188.     while(1)  
  189.     {  
  190.         NS.CheckConnect();  
  191.         sleep(2);  
  192.     }  
  193.     return 0;  
  194. }  

此文章来自于【http://blog.csdn.net/ouyangshima/article/details/7545578】