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

linux下C++SocketTCP编程---客户端

 
阅读更多

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;
}



分享到:
评论

相关推荐

    Linux下socket实现TCP网络通讯(多个客户端之间的通讯)

    在学习《UNIX网络编程》基础上自己动手实现TCP服务器和客户端通讯,这个版本是进阶版程序——实现多个客户端的之间的通讯。程序包含了常规网络通讯的主要步骤,除此之外还运用了select()和poll()等技术,具有一定...

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

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

    基于RTSP的linux环境编程的客户端实现

    RTSP(Real Time Streaming Protocol),参考标准为RFC2326,实时流传输协议,是TCP/IP协议体系中的一个 应用层协议提供播放、暂停、后退、前进等操作。 主要用来控制具有实时特性的数据的发送,但其本身并不用于...

    C++教程网《Linux网络编程》视频百度云地址

    Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口)...

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

    Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口)...

    高性能跨平台(Win&Linux;)网络通信框架 HP-Socket

    Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言...

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

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

    c++教程网的linux网络编程视频下载

    Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口)...

    (牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码)

    (牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码) 技术框架: 1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. ...

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

    Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02...

    C++教程网视频:linux网络编程

    Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口)...

    HP-Socket-master.zip

    HP-Socket是一套通用的高性能TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言...

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

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

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

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

    基于C++11线程池技术简单易用的轻量级网络编程框架源码.zip

    tcp/udp客户端,接口简单易用并且是线程安全的,用户不必关心具体的socket api操作。 tcp服务器,使用非常简单,只要实现具体的tcp会话(TcpSession类)逻辑,使用模板的方式可以快速的构建高性能的服务器。 对套接字...

    基于VS2019 C++的跨平台(Linux)开发的项目——360 度智能行车辅助系统

    该项目由客户端、服务器构成,采用大并发通信框架思想和自定义协议,基于 TCP/IP 通讯协议封装了包含通信组件、动态数组以及线程池等技术的通信框架。以及基于 OpenCV 的图像处理功能。 功能模块:红绿灯检测、车辆...

    Linux高性能服务器编程

    《Linux高性能服务器编程》共17章,分为3个部分:第一部分对Linux服务器编程的核心基础——TCP/IP协议进行了深入的解读和阐述,包括TCP/IP协议族、TCP/IP协议,以及一个经典的TCP/IP通信案例;第二部分对高性能...

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

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

Global site tag (gtag.js) - Google Analytics