NetServer.h
#ifndef NETSERVER_H_ #define NETSERVER_H_ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/wait.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <iostream> using namespace std; class NetServer { public: NetServer(); virtual ~NetServer(); void CreateConnect(); void CheckConnect(); void RevHello(char* str,int para[]); void SendHelloToo(); protected: void AcceptConnect(); void HandlePacket(); bool CheckBuff(char* str,int num); void DividePacket(char* str); void HandlePacketHead(char** str,int param[]); void SendPacket(string str); private: #define MAXBUF 1024 char buff[MAXBUF]; int sockfd,clientfd; sockaddr_in clientAddr; socklen_t len; bool connectFlag; }; #endif /* NETSERVER_H_ */
NetServer.cpp
#include "NetServer.h" #define defPort 7788 NetServer::NetServer() { } NetServer::~NetServer() { close(sockfd); } void NetServer::CreateConnect() { sockaddr_in serverAddr; connectFlag=false; if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1) { printf("socket created failly,errno=%d,errorInfo: %s\n",errno,strerror(errno)); exit(1); } else printf("socket created successfully\n"); bzero(&serverAddr,sizeof(serverAddr)); serverAddr.sin_family=PF_INET; serverAddr.sin_port=htons(defPort); serverAddr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(sockfd,(sockaddr*)&serverAddr,sizeof(sockaddr))==-1) { printf("bind failly,errno=%d,errorInfo: %s\n",errno,strerror(errno)); exit(1); } else printf("bind successfully\n"); if(listen(sockfd,10)==-1) { printf("listen failly,errno=%d,errorInfo: %s\n",errno,strerror(errno)); exit(1); } else printf("listen successfully\n"); len=sizeof(struct sockaddr); int b_on = 1; ioctl (sockfd, FIONBIO, &b_on); } void NetServer::CheckConnect() { if(connectFlag) HandlePacket(); else AcceptConnect(); } void NetServer::AcceptConnect() { clientfd=accept(sockfd,(sockaddr*)&clientAddr,&len); if(clientfd==-1) { connectFlag=false; printf("accept failly,errno=%d,errorInfo: %s\n",errno,strerror(errno)); } else { connectFlag=true; printf("server:got connection from %s,port %d,socket %d\n",inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port), clientfd); long b_on = 1; ioctl (clientfd, FIONBIO, &b_on); } } void NetServer::HandlePacket() { char buff[MAXBUF]; bzero(buff,MAXBUF); int res=recv(clientfd,buff,MAXBUF,0); if(res!=-1) { if(CheckBuff(buff,res)) DividePacket(buff); else cout<<"\""<<buff<<"\""<<" has illegal data!!!"<<endl; } else printf("recv failly,errno=%d,errorInfo: %s\n",errno,strerror(errno)); } bool NetServer::CheckBuff(char* str,int num) { //合法字符只有空格(32),_ (95)小写字母(97~122)和数字(48~57) for(int i=0;i<num;i++) { if(str[i]==32||str[i]==95) continue; else if(str[i]>=97&&str[i]<=122) continue; else if(str[i]>=48&&str[i]<=57) continue; else return false; } return true; } void NetServer::DividePacket(char* paraStr) { char* strPtr[10]; int paraList[10][10]; for(int i=0;i<10;i++) { strPtr[i]=NULL; for(int j=0;j<10;j++) { paraList[i][j]='|'; } } char* subStr=strtok(paraStr," "); int i=0,j=0; while(subStr!=NULL) { if(*subStr>=48 && *subStr<=57) { paraList[i-1][j]=atoi(subStr); cout<<"subdata: "<<subStr<<" paraList["<<i<<"]["<<j<<"]="<<paraList[i-1][j]<<endl; j++; } else { strPtr[i]=subStr; i++; j=0; } subStr=strtok(NULL," "); } for(int i=0;i<10;i++) { if(strPtr[i]) { HandlePacketHead(strPtr+i,paraList[i]); } } } void NetServer::HandlePacketHead(char** str,int param[]) { if(strcmp(*str,"hello")==0) { RevHello(*str,param); } else if(strcmp(*str,"thankyou")==0) { cout<<"thankyou---------"<<param[0]<<endl; } else { cout<<"not useful info: "<<*str<<" para: "<<*param<<endl; } } void NetServer::RevHello(char* str,int para[]) { cout<<"receive: "<<str<<" "; for(int i=0;i<10;i++) { if(para[i]!='|')// '|'==124 cout<<para[i]<<" "; // else // cout<<"!!!"<<para[i]<<" "; } cout<<endl; cout<<"\ntwo para="<<para[1]<<endl; if(para[0]==1989) SendHelloToo(); } void NetServer::SendPacket(string str) { char buff[MAXBUF]; bzero(buff,MAXBUF); strcpy(buff,str.data()); int len=send(clientfd,buff,strlen(buff),0); if(len==-1) printf("send failly,errno=%d,errorInfo:%s",errno,strerror(errno)); else printf("send successfully,InfoLen=%d,Info: '%s'.\n",len,buff); } void NetServer::SendHelloToo() { SendPacket("women 789"); } int main() { NetServer NS; NS.CreateConnect(); while(1) { NS.CheckConnect(); sleep(2); } return 0; }