linux下C++SocketTCP编程---服务器端
来源:互联网 发布:如何建立网络链接 编辑:程序博客网 时间:2024/06/08 06:38
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;
- }
此文章来自于【http://blog.csdn.net/ouyangshima/article/details/7545578】
- linux下C++SocketTCP编程---服务器端
- linux下C++SocketTCP编程---服务器端
- linux下C++SocketTCP编程---服务器端
- linux下C++SocketTCP编程---客户端
- linux下C++SocketTCP编程---客户端
- linux下C++SocketTCP编程---客户端
- Linux 下 C++ Socket编程 服务器端
- Linux下C编程
- linux下c编程
- Linux下c编程
- linux下C编程
- linux下c编程
- Linux下C编程
- 基于UDP的服务器端/客户端---------网络编程(Linux----C)
- Linux下使用libevent库实现服务器端编程
- Linux下socket编程之多进程TCP服务器端
- linux 编程:UDP协议下实现服务器端程序设计
- 【Linux】Linux 下C编程
- 软考信息系统项目管理师考试心得-备考
- mysql 存储过程
- d叉堆
- MySQL日期处理
- shell中引号的用法
- linux下C++SocketTCP编程---服务器端
- N皇后高效算法
- CAPWAP开源代码下载
- 读:马化腾致信合作伙伴:灰度法则的七个维度
- 如何提高自制力?自制力差怎么办?
- GoF23种设计模式之创建型模式之单态模式
- selenium webdriver学习(八)------------如何操作select下拉框
- 编码大全
- java 中文 转换拼音