linux下C++SocketTCP编程---客户端
2012-05-08 11:33
225 查看
NetClient.h
NetClient.cpp
#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下C++SocketTCP编程---客户端
- linux下C++SocketTCP编程---客户端
- Linux下的C语言编程——简单实现tcp客户端和服务器
- linux下TCP编程示例(服务端/客户端)
- linux下C++SocketTCP编程---服务器端
- Linux网络编程 之 TCP 多线程的服务器和客户端同时收发数据
- linux tcp多线程服务器与客户端编程实例
- Linux 网络编程——TCP编程之客户端
- (一)linux C语言TCP服务端/客户端简单编程步骤
- Linux下基本TCP socket编程之客户端
- linux下网络编程2:服务端和客户端进行TCP通信实例
- linux下C++SocketTCP编程---服务器端
- [Linux网络编程]TCP编程--TCP通信程序客户端
- Linux TCP客户端、服务器编程模型及实例
- linux下C++SocketTCP编程---服务器端
- linux网络编程--服务器客户端(TCP实现)
- TCP/TP编程 - 一个简单的Linux下C写的socket服务器客户端程序
- 基于TCP的服务器端/客户端(二)---------网络编程(Linux----C)
- Linux网络编程之TCP编程,多进程实现多客户端编程
- linux下的tcp/udp服务端和客户端编程