原理很简单,采用数据包提交的方式提交到服务端。
一下是源代码:(Ubuntu13.04 64位 Linux)
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
using namespace std;
typedef void (*FUNC)(const char*);
char* GetData(const string& filename="data.dat");
void SendData(const char* buf,const string& host,FUNC fun=NULL);
void ChkRet(const char* rcv);
void WriteData(const char* buf,int size,const string& filename);
void PrintFrame(const string& str="unknow");
int main(int argc,char *argv[])
{
try{
char *dat=argc>=3?GetData(string(argv[2])):GetData();
string host=argc>=2?argv[1]:"10.0.17.130";
int slptime=argc>=4?atoi(argv[3]):1;
while(true){
try{SendData(dat,host,ChkRet);
}catch(const char* info){
PrintFrame(string(info)+string("\n\tPlease check your network.\n\tRetrying..."));
}
sleep(slptime);
}
delete[] dat;
}catch(const char* info){
cerr<<info<<endl;
}
return 0;
}
char* GetData(const string& filename)
{
ifstream fs;
fs.open(filename.c_str(),ios::in|ios::binary);
if(!fs) throw "Cannot open the data file";
fs.seekg(0,ios::end);
long flen=fs.tellg();
if(flen==0) throw "The data file is empty";
fs.seekg(0,ios::beg);
char *buf=new char[flen];
fs.read(buf,flen);
fs.close();
return buf;
}
void SendData(const char* buf,const string& host,FUNC fun)
{
hostent *pURL = gethostbyname(host.c_str());
if(pURL==NULL) throw "Cannot get hostname!!!";
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long*)pURL->h_addr);
addr.sin_port = htons(80);
//Connect
int sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sockfd==-1) throw "socket error";
if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr))==-1)
{
close(sockfd);
throw "Cannot connect the host!!!";
}
static char header[1024];
sprintf(header,buf,host.c_str());
//cout<<strlen(header)<<endl;
if(send(sockfd, header, strlen(header), 0)==-1)
{
close(sockfd);
throw "Sending data error!!!";
}
static char pagebuf[BUFSIZ+1];
if(fun)
{
int rcvrt;
rcvrt=recv(sockfd,pagebuf,BUFSIZ,0);
rcvrt=recv(sockfd,pagebuf,BUFSIZ,0);
pagebuf[rcvrt]='\0';
fun(pagebuf);
if(rcvrt==-1)
{
close(sockfd);
throw "Receiving data error!!!";
}
}
close(sockfd);
}
void ChkRet(const char* rcv)
{
PrintFrame(strstr(rcv,"FFFF")?"Succeed!":"Failed!");
}
void PrintFrame(const string& str)
{
time_t rawtime;
time ( &rawtime );
system("clear");
cout<<"##############LoginRobot###############\n"<<endl;
cout<<"State:\n\t"<<str<<endl;
cout<<"Time:\n\t"<<asctime (localtime ( &rawtime ))<<endl;
cout<<"\t[For CSU only.Made by KingDuan]"<<endl;
cout<<"#######################################"<<endl;
}