NetClient.h
#ifndef NETCLIENT_H_
#define NETCLIENT_H_
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <iostream>
using namespace std;
class NetClient {
public:
NetClient();
virtual ~NetClient();
void RevHello(char* str,int para[]);
void SendHi();
void CreateConnect();
void CheckConnect();
void MyTest();
protected:
void ConnectServer();
bool CheckBuff(char* str,int num);
void HandlePacket();
void DividePacket(char* str);
void HandlePacketHead(char** str,int param[]);
void SendPacket(string strInfo);
private:
#define MAXBUF 1024
int sockfd;
struct sockaddr_in serverAddr;
bool connectFlag;
};
#endif /* NETCLIENT_H_ */
NetClient.cpp
#include "NetClient.h"
#define defPort 7788 //ssh服务的端口号:22
char defIP[]="127.0.0.1";
NetClient::NetClient()
{
}
NetClient::~NetClient()
{
close(sockfd);
}
void NetClient::CreateConnect()
{
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==0)
{
printf("create socket errno:%d, errerInfo:%s\n",errno,strerror(errno));
exit(1);
}
else
printf("socket created sucessfully\n");
bzero(&serverAddr,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(defPort);
serverAddr.sin_addr.s_addr=inet_addr(defIP);
connectFlag=false;
int b_on = 1;
ioctl (sockfd, FIONBIO, &b_on);
//设置socket属性为非阻塞方式
// if(fcntl(sockfd,F_SETFL,O_NONBLOCK)==-1)
// printf("fcntl errno:%d, errerInfo:%s\n",errno,strerror(errno));
}
void NetClient::CheckConnect()
{
if(connectFlag)
HandlePacket();
else
ConnectServer();
}
void NetClient::ConnectServer()
{
if(connect(sockfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr))!=0)
{
connectFlag=false;
printf("connect erron:%d, errerInfo:%s\n",errno,strerror(errno));
}
else
{
connectFlag=true;
printf("client connect to server successfully\n\n\n");
int b_on = 1;
ioctl (sockfd, FIONBIO, &b_on);
}
}
void NetClient::HandlePacket()
{
char buffer[MAXBUF];
bzero(buffer,MAXBUF);
int ret=recv(sockfd,buffer,sizeof(buffer),0);
if(ret!=-1)
{
if(CheckBuff(buffer,ret))
DividePacket(buffer);
else
cout<<"\""<<buffer<<"\""<<" has illegal data!!!"<<endl;
}
else
cout<<"recv erron="<<errno<<" errorInfo:"<<strerror(errno)<<endl;
}
bool NetClient::CheckBuff(char* str,int num)
{
//合法字符只有空格(32),_ (95)小写字母(97~122)和数字(48~57)
for(int i=32;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 NetClient::DividePacket(char* str)
{
char* strHead[10];
int paraList[10][10];
for(int i=0;i<10;i++)
{
strHead[i]=NULL;
for(int j=0;j<10;j++)
paraList[i][j]='|';
}
char* subStr=strtok(str," ");
int i=0,j=0;
while(subStr!=NULL)
{
if(*subStr>=48 && *subStr<=57)
{
paraList[i-1][j]=atoi(subStr);
j++;
}
else
{
strHead[i]=subStr;
i++;
j=0;
}
subStr=strtok(NULL," ");
}
for(int i=0;i<10;i++)
{
if(strHead[i])
HandlePacketHead(strHead+i,paraList[i]);
}
}
void NetClient::HandlePacketHead(char** str,int param[])
{
if(strcmp(*str,"hello")==0)
{
RevHello(*str,param);
}
else if(strcmp(*str,"women")==0)
{
cout<<"hellotoo"<<param[0]<<endl;
SendPacket("thankyou 9809");
}
else
{
cout<<"no matched Info: "<<*str<<" para: "<<*param<<endl;
}
}
void NetClient::SendPacket(string strInfo)
{
char buffer[MAXBUF];
bzero(buffer,MAXBUF);
strcpy(buffer,strInfo.data());
int len=send(sockfd,buffer,strlen(buffer),0);
if(len==-1)
printf("send errno=%d,errerInfo: %s\n",errno,strerror(errno));
else
printf("send successful: '%s' ,InfoLen=%d\n",buffer,len);
}
void NetClient::RevHello(char* str,int para[])
{
cout<<"rev "<<str<<" ";
for(int i=0;i<10;i++)
{
if(para[i]!='|')
cout<<para[i]<<" ";
else
cout<<" -!-"<<para[i];
}
cout<<endl;
cout<<"I rev info"<<endl;
}
void NetClient::SendHi()
{
SendPacket("hello 1989 7812 hex 85");
}
void NetClient::MyTest()
{
//初始化服务器端的ip和端口信息
bzero(&serverAddr,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(defPort);
//本地IP地址 转换成 网络ip
//serverAddr.sin_addr.s_addr=inet_addr(defIP);
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
cout<<"internet IP: "<<serverAddr.sin_addr.s_addr<<endl;
cout<<"internet port: "<<serverAddr.sin_port<<" ntohs"<<ntohs(serverAddr.sin_port)<<endl;
if(inet_aton(defIP,(struct in_addr*)&serverAddr.sin_addr.s_addr)==0)
printf("inet_aton errno:%d, errerInfo:%s\n",errno,strerror(errno));
cout<<"123internet IP: "<<serverAddr.sin_addr.s_addr<<endl;
cout<<"IP: "<<inet_ntoa(serverAddr.sin_addr)<<endl;
}
int main()
{
NetClient NC;
//NC.MyTest();
NC.CreateConnect();
while(1)
{
sleep(2);
NC.CheckConnect();
sleep(2);
NC.SendHi();
}
return 0;
}
分享到:
相关推荐
在学习《UNIX网络编程》基础上自己动手实现TCP服务器和客户端通讯,这个版本是进阶版程序——实现多个客户端的之间的通讯。程序包含了常规网络通讯的主要步骤,除此之外还运用了select()和poll()等技术,具有一定...
Socket编程示例 实现类似SSH功能(但是不使用SSH),Windows客户端,Linux服务器端.zip
RTSP(Real Time Streaming Protocol),参考标准为RFC2326,实时流传输协议,是TCP/IP协议体系中的一个 应用层协议提供播放、暂停、后退、前进等操作。 主要用来控制具有实时特性的数据的发送,但其本身并不用于...
Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口)...
Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口)...
Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言...
该项目是在linux下采用C/C++编程,基于TCP协议,服务器端采用多进程长连接的socket的通信方式,并采用开源的负载均衡器G6作为客户端请求与服务端响应的中间件分发器。考虑到服务器端如果每接收到一个请求fork一个...
Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口)...
(牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码) 技术框架: 1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. ...
Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02...
Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口)...
HP-Socket是一套通用的高性能TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言...
该项目是在linux下采用C/C++编程,基于TCP协议,服务器端采用多进程长连接的socket的通信方式,并采用开源的负载均衡器G6作为客户端请求与服务端响应的中间件分发器,G6是该开发者在G5的基础上的升级版,相比G5多了...
##### 涉及到的技术:(1)Linux下socket编程, 封装TcpServer,TcpClient(2)Libevent网络框架库的使用(3)服务器端线程池的使用以及其负载均衡(4)MySQL数据库C接口的C++类封装(5)单例模式(6)负载均衡算法...
tcp/udp客户端,接口简单易用并且是线程安全的,用户不必关心具体的socket api操作。 tcp服务器,使用非常简单,只要实现具体的tcp会话(TcpSession类)逻辑,使用模板的方式可以快速的构建高性能的服务器。 对套接字...
该项目由客户端、服务器构成,采用大并发通信框架思想和自定义协议,基于 TCP/IP 通讯协议封装了包含通信组件、动态数组以及线程池等技术的通信框架。以及基于 OpenCV 的图像处理功能。 功能模块:红绿灯检测、车辆...
《Linux高性能服务器编程》共17章,分为3个部分:第一部分对Linux服务器编程的核心基础——TCP/IP协议进行了深入的解读和阐述,包括TCP/IP协议族、TCP/IP协议,以及一个经典的TCP/IP通信案例;第二部分对高性能...
在Linux环境下使用GNU C或者GNU C++,在Linux make 开发工具的管理和控制下,利用Linux系统提供的Socket库和MySQL数据库在网络底层开发交易型中间件,同时简要介绍了客户端和服务器的工作模式。本次模拟手机交费系统...