linux下C++SocketTCP编程---客户端

NetClient.h

[cpp]  view plain copy
  1. #ifndef NETCLIENT_H_  
  2. #define NETCLIENT_H_  
  3. #include <stdio.h>  
  4. #include <string.h>  
  5. #include <errno.h>  
  6. #include <sys/socket.h>  
  7. #include <resolv.h>  
  8. #include <stdlib.h>  
  9. #include <netinet/in.h>  
  10. #include <arpa/inet.h>  
  11. #include <unistd.h>  
  12. #include <fcntl.h>  
  13. #include <sys/ioctl.h>  
  14. #include <iostream>  
  15. using namespace std;  
  16. class NetClient {  
  17. public:  
  18.     NetClient();  
  19.     virtual ~NetClient();  
  20.     void RevHello(char* str,int para[]);  
  21.     void SendHi();  
  22.     void CreateConnect();  
  23.     void CheckConnect();  
  24.     void MyTest();  
  25. protected:  
  26.     void ConnectServer();  
  27.     bool CheckBuff(char* str,int num);  
  28.     void HandlePacket();  
  29.     void DividePacket(char* str);  
  30.     void HandlePacketHead(char** str,int param[]);  
  31.     void SendPacket(string strInfo);  
  32. private:  
  33. #define MAXBUF 1024  
  34.     int sockfd;  
  35.     struct sockaddr_in serverAddr;  
  36.     bool connectFlag;  
  37. };  
  38. #endif /* NETCLIENT_H_ */  


NetClient.cpp

[cpp]  view plain copy
  1. #include "NetClient.h"  
  2.   
  3. #define defPort 7788   //ssh服务的端口号:22  
  4. char defIP[]="127.0.0.1";  
  5. NetClient::NetClient()  
  6. {  
  7. }  
  8. NetClient::~NetClient()  
  9. {  
  10.     close(sockfd);  
  11. }  
  12. void NetClient::CreateConnect()  
  13. {  
  14.     if((sockfd=socket(AF_INET,SOCK_STREAM,0))==0)  
  15.     {  
  16.         printf("create socket errno:%d, errerInfo:%s\n",errno,strerror(errno));  
  17.         exit(1);  
  18.     }  
  19.     else  
  20.         printf("socket created sucessfully\n");  
  21.   
  22.     bzero(&serverAddr,sizeof(serverAddr));  
  23.     serverAddr.sin_family=AF_INET;  
  24.     serverAddr.sin_port=htons(defPort);  
  25.     serverAddr.sin_addr.s_addr=inet_addr(defIP);  
  26.   
  27.     connectFlag=false;  
  28.     int b_on = 1;  
  29.     ioctl (sockfd, FIONBIO, &b_on);  
  30.   
  31.     //设置socket属性为非阻塞方式  
  32. //  if(fcntl(sockfd,F_SETFL,O_NONBLOCK)==-1)  
  33. //      printf("fcntl errno:%d, errerInfo:%s\n",errno,strerror(errno));  
  34. }  
  35. void NetClient::CheckConnect()  
  36. {  
  37.     if(connectFlag)  
  38.         HandlePacket();  
  39.     else  
  40.         ConnectServer();  
  41. }  
  42. void NetClient::ConnectServer()  
  43. {  
  44.     if(connect(sockfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr))!=0)  
  45.     {  
  46.         connectFlag=false;  
  47.         printf("connect erron:%d, errerInfo:%s\n",errno,strerror(errno));  
  48.     }  
  49.     else  
  50.     {  
  51.         connectFlag=true;  
  52.         printf("client connect to server successfully\n\n\n");  
  53.         int b_on = 1;  
  54.         ioctl (sockfd, FIONBIO, &b_on);  
  55.     }  
  56. }  
  57. void NetClient::HandlePacket()  
  58. {  
  59.     char buffer[MAXBUF];  
  60.     bzero(buffer,MAXBUF);  
  61.     int ret=recv(sockfd,buffer,sizeof(buffer),0);  
  62.     if(ret!=-1)  
  63.     {  
  64.         if(CheckBuff(buffer,ret))  
  65.             DividePacket(buffer);  
  66.         else  
  67.             cout<<"\""<<buffer<<"\""<<" has illegal data!!!"<<endl;  
  68.     }  
  69.     else  
  70.         cout<<"recv erron="<<errno<<"  errorInfo:"<<strerror(errno)<<endl;  
  71. }  
  72. bool NetClient::CheckBuff(char* str,int num)  
  73. {  
  74.     //合法字符只有空格(32),_ (95)小写字母(97~122)和数字(48~57)  
  75.     for(int i=32;i<num;i++)  
  76.     {  
  77.         if(str[i]==32||str[i]==95)  
  78.             continue;  
  79.         else if(str[i]>=97&&str[i]<=122)  
  80.             continue;  
  81.         else if(str[i]>=48&&str[i]<=57)  
  82.             continue;  
  83.         else  
  84.             return false;  
  85.     }  
  86.     return true;  
  87. }  
  88. void NetClient::DividePacket(char* str)  
  89. {  
  90.     char* strHead[10];  
  91.     int paraList[10][10];  
  92.     for(int i=0;i<10;i++)  
  93.     {  
  94.         strHead[i]=NULL;  
  95.         for(int j=0;j<10;j++)  
  96.             paraList[i][j]='|';  
  97.     }  
  98.     char* subStr=strtok(str," ");  
  99.     int i=0,j=0;  
  100.     while(subStr!=NULL)  
  101.     {  
  102.         if(*subStr>=48 && *subStr<=57)  
  103.         {  
  104.             paraList[i-1][j]=atoi(subStr);  
  105.             j++;  
  106.         }  
  107.         else  
  108.         {  
  109.             strHead[i]=subStr;  
  110.             i++;  
  111.             j=0;  
  112.         }  
  113.         subStr=strtok(NULL," ");  
  114.     }  
  115.     for(int i=0;i<10;i++)  
  116.     {  
  117.         if(strHead[i])  
  118.             HandlePacketHead(strHead+i,paraList[i]);  
  119.     }  
  120. }  
  121. void NetClient::HandlePacketHead(char** str,int param[])  
  122. {  
  123.     if(strcmp(*str,"hello")==0)  
  124.     {  
  125.         RevHello(*str,param);  
  126.     }  
  127.     else if(strcmp(*str,"women")==0)  
  128.     {  
  129.         cout<<"hellotoo"<<param[0]<<endl;  
  130.         SendPacket("thankyou 9809");  
  131.     }  
  132.     else  
  133.     {  
  134.         cout<<"no matched Info: "<<*str<<"    para: "<<*param<<endl;  
  135.     }  
  136. }  
  137. void NetClient::SendPacket(string strInfo)  
  138. {  
  139.     char buffer[MAXBUF];  
  140.     bzero(buffer,MAXBUF);  
  141.     strcpy(buffer,strInfo.data());  
  142.     int len=send(sockfd,buffer,strlen(buffer),0);  
  143.     if(len==-1)  
  144.         printf("send errno=%d,errerInfo: %s\n",errno,strerror(errno));  
  145.     else  
  146.         printf("send successful: '%s' ,InfoLen=%d\n",buffer,len);  
  147. }  
  148. void NetClient::RevHello(char* str,int para[])  
  149. {  
  150.     cout<<"rev "<<str<<" ";  
  151.     for(int i=0;i<10;i++)  
  152.     {  
  153.         if(para[i]!='|')  
  154.             cout<<para[i]<<" ";  
  155.         else  
  156.             cout<<" -!-"<<para[i];  
  157.     }  
  158.     cout<<endl;  
  159.     cout<<"I rev info"<<endl;  
  160. }  
  161. void NetClient::SendHi()  
  162. {  
  163.     SendPacket("hello 1989 7812 hex 85");  
  164. }  
  165.   
  166. void NetClient::MyTest()  
  167. {  
  168.     //初始化服务器端的ip和端口信息  
  169.     bzero(&serverAddr,sizeof(serverAddr));  
  170.     serverAddr.sin_family=AF_INET;  
  171.     serverAddr.sin_port=htons(defPort);  
  172.   
  173.     //本地IP地址 转换成 网络ip  
  174.     //serverAddr.sin_addr.s_addr=inet_addr(defIP);  
  175.     serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);  
  176.     cout<<"internet IP: "<<serverAddr.sin_addr.s_addr<<endl;  
  177.     cout<<"internet port: "<<serverAddr.sin_port<<"  ntohs"<<ntohs(serverAddr.sin_port)<<endl;  
  178.     if(inet_aton(defIP,(struct in_addr*)&serverAddr.sin_addr.s_addr)==0)  
  179.         printf("inet_aton errno:%d, errerInfo:%s\n",errno,strerror(errno));  
  180.   
  181.     cout<<"123internet IP: "<<serverAddr.sin_addr.s_addr<<endl;  
  182.     cout<<"IP: "<<inet_ntoa(serverAddr.sin_addr)<<endl;  
  183. }  
  184. int main()  
  185. {  
  186.     NetClient NC;  
  187.     //NC.MyTest();  
  188.     NC.CreateConnect();  
  189.     while(1)  
  190.     {  
  191.         sleep(2);  
  192.         NC.CheckConnect();  
  193.         sleep(2);  
  194.         NC.SendHi();  
  195.     }  
  196.     return 0;  
  197. }  

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

你可能感兴趣的:(linux,socket,tcp,网络编程)