CSU wifi免帐号自动登陆器

原理很简单,采用数据包提交的方式提交到服务端。

一下是源代码:(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;	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值