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;
}
分享到:
相关推荐
Socket编程示例 实现类似SSH功能(但是不使用SSH),Windows客户端,Linux服务器端.zip
该项目是在linux下采用C/C++编程,基于TCP协议,服务器端采用多进程长连接的socket的通信方式,并采用开源的负载均衡器G6作为客户端请求与服务端响应的中间件分发器。考虑到服务器端如果每接收到一个请求fork一个...
作者简介 游 双,资深Linux软件开发工程师,对Linux网络编程,尤其 是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关...
该项目是在linux下采用C/C++编程,基于TCP协议,服务器端采用多进程长连接的socket的通信方式,并采用开源的负载均衡器G6作为客户端请求与服务端响应的中间件分发器,G6是该开发者在G5的基础上的升级版,相比G5多了...
作者简介 游 双,资深Linux软件开发工程师,对Linux网络编程,尤其是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关的...
##### 涉及到的技术:(1)Linux下socket编程, 封装TcpServer,TcpClient(2)Libevent网络框架库的使用(3)服务器端线程池的使用以及其负载均衡(4)MySQL数据库C接口的C++类封装(5)单例模式(6)负载均衡算法...
作者简介游 双,资深Linux软件开发工程师,对Linux网络编程,尤其是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关的...
大多数项目是在Linux下开发服务器端,而在Windows下开发客户端,需要经常在两大平台之间进行切换,单独学习一种平台没有实践意义。 值得欣慰的是,两大平台下的 socket 编程非常相似,并不会增加多少学习成本。
在Linux环境下使用GNU C或者GNU C++,在Linux make 开发工具的管理和控制下,利用Linux系统提供的Socket库和MySQL数据库在网络底层开发交易型中间件,同时简要介绍了客户端和服务器的工作模式。本次模拟手机交费系统...
服务器端以插件配置方式动态加入功能组件; 客户端以XML文本描述方式, 调用服务端功能组件的函数; 服务端也同样以XML文本描述调用返回结果, 类似于XML-PRC或者Web Services; <br> 2. 优势/特点: a. ...
内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 ) 如题。 ...
服务器端以插件配置方式动态加入功能组件; 客户端以XML文本描述方式, 调用服务端功能组件的函数; 服务端也同样以XML文本描述调用返回结果, 类似于XML-PRC或者Web Services; <br> 2. 优势/特点: a. ...
服务器端以插件配置方式动态加入功能组件; 客户端以XML文本描述方式, 调用服务端功能组件的函数; 服务端也同样以XML文本描述调用返回结果, 类似于XML-PRC或者Web Services; <br> 2. 优势/特点: a. ...
要求本机既是客户端又是服务器端; (2)实验内容 所编写的程序应具有如下功能: 1. 具有点对点通信功能,任意客户端之间能够发送消息; 2. 具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能...
内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...
内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...
内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...
内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...
内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...