`
jiagou
  • 浏览: 2525573 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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 tcp编程示例 实现类似SSH功能(但是不使用SSH),Windows客户端,Linux服务器端.zip

    Socket编程示例 实现类似SSH功能(但是不使用SSH),Windows客户端,Linux服务器端.zip

    C++项目-C++实现云盘项目实战-包括client端和server端

    该项目是在linux下采用C/C++编程,基于TCP协议,服务器端采用多进程长连接的socket的通信方式,并采用开源的负载均衡器G6作为客户端请求与服务端响应的中间件分发器。考虑到服务器端如果每接收到一个请求fork一个...

    Linux高性能服务器编程.pdf

    作者简介 游 双,资深Linux软件开发工程师,对Linux网络编程,尤其 是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关...

    linux下c++模拟实现云盘项目

    该项目是在linux下采用C/C++编程,基于TCP协议,服务器端采用多进程长连接的socket的通信方式,并采用开源的负载均衡器G6作为客户端请求与服务端响应的中间件分发器,G6是该开发者在G5的基础上的升级版,相比G5多了...

    Linux高性能服务器编程清晰PDF+源码.7z

    作者简介 游 双,资深Linux软件开发工程师,对Linux网络编程,尤其是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关的...

    distributed-system-framework-master_c++mysql单例_虚拟机调度_

    ##### 涉及到的技术:(1)Linux下socket编程, 封装TcpServer,TcpClient(2)Libevent网络框架库的使用(3)服务器端线程池的使用以及其负载均衡(4)MySQL数据库C接口的C++类封装(5)单例模式(6)负载均衡算法...

    Linux高性能服务器编程

    作者简介游 双,资深Linux软件开发工程师,对Linux网络编程,尤其是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关的...

    通信网络编程作业整理

    大多数项目是在Linux下开发服务器端,而在Windows下开发客户端,需要经常在两大平台之间进行切换,单独学习一种平台没有实践意义。 值得欣慰的是,两大平台下的 socket 编程非常相似,并不会增加多少学习成本。

    Linux手机模拟缴费系统(完整版)

    在Linux环境下使用GNU C或者GNU C++,在Linux make 开发工具的管理和控制下,利用Linux系统提供的Socket库和MySQL数据库在网络底层开发交易型中间件,同时简要介绍了客户端和服务器的工作模式。本次模拟手机交费系统...

    C++网络服务开发套件0.5.5

    服务器端以插件配置方式动态加入功能组件; 客户端以XML文本描述方式, 调用服务端功能组件的函数; 服务端也同样以XML文本描述调用返回结果, 类似于XML-PRC或者Web Services; &lt;br&gt; 2. 优势/特点: a. ...

    vc++ 开发实例源码包

    内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 ) 如题。 ...

    C++网络服务开发套件0.5.6

    服务器端以插件配置方式动态加入功能组件; 客户端以XML文本描述方式, 调用服务端功能组件的函数; 服务端也同样以XML文本描述调用返回结果, 类似于XML-PRC或者Web Services; &lt;br&gt; 2. 优势/特点: a. ...

    C++网络服务开发套件0.5.3

    服务器端以插件配置方式动态加入功能组件; 客户端以XML文本描述方式, 调用服务端功能组件的函数; 服务端也同样以XML文本描述调用返回结果, 类似于XML-PRC或者Web Services; &lt;br&gt; 2. 优势/特点: a. ...

    实验三Socket通信实验报告.doc

    要求本机既是客户端又是服务器端; (2)实验内容 所编写的程序应具有如下功能: 1. 具有点对点通信功能,任意客户端之间能够发送消息; 2. 具有群组通信功能,客户端能够向组内成员同时发送消息,其他组成员不能...

    vc++ 应用源码包_6

    内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...

    vc++ 应用源码包_1

    内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...

    vc++ 应用源码包_5

    内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...

    vc++ 应用源码包_3

    内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...

    vc++ 应用源码包_2

    内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 PlayerDrectShow...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

Global site tag (gtag.js) - Google Analytics