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

来源:互联网 发布:staub和le creuset知乎 编辑:程序博客网 时间:2024/06/04 23:00

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 1024char buff[MAXBUF];int sockfd,clientfd;sockaddr_in clientAddr;socklen_t len;bool connectFlag;};#endif /* NETSERVER_H_ */


NetServer.cpp

#include "NetServer.h"#define defPort 7788NetServer::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);}elseprintf("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);}elseprintf("bind successfully\n");if(listen(sockfd,10)==-1){printf("listen failly,errno=%d,errorInfo: %s\n",errno,strerror(errno));exit(1);}elseprintf("listen successfully\n");len=sizeof(struct sockaddr);int b_on = 1;ioctl (sockfd, FIONBIO, &b_on);}void NetServer::CheckConnect(){if(connectFlag)HandlePacket();elseAcceptConnect();}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);elsecout<<"\""<<buff<<"\""<<"  has illegal data!!!"<<endl;}elseprintf("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;elsereturn 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]!='|')// '|'==124cout<<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));elseprintf("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;}


原创粉丝点击