第一次上传
This commit is contained in:
@@ -0,0 +1,505 @@
|
||||
#include "http.h"
|
||||
#include "网络协议提交.h"
|
||||
|
||||
char *到期时间 = NULL;
|
||||
//-----------------------------------------@OQMODs---------------------------------------------
|
||||
#ifndef MD5_H
|
||||
#define MD5_H
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int count[2];
|
||||
unsigned int state[4];
|
||||
unsigned char buffer[64];
|
||||
} MD5_CTX;
|
||||
|
||||
#define F(x, y, z) ((x & y) | (~x & z))
|
||||
#define G(x, y, z) ((x & z) | (y & ~z))
|
||||
#define H(x, y, z) (x ^ y ^ z)
|
||||
#define I(x, y, z) (y ^ (x | ~z))
|
||||
#define ROTATE_LEFT(x, n) ((x << n) | (x >> (32 - n)))
|
||||
#define FF(a, b, c, d, x, s, ac) \
|
||||
{ \
|
||||
a += F(b, c, d) + x + ac; \
|
||||
a = ROTATE_LEFT(a, s); \
|
||||
a += b; \
|
||||
}
|
||||
#define GG(a, b, c, d, x, s, ac) \
|
||||
{ \
|
||||
a += G(b, c, d) + x + ac; \
|
||||
a = ROTATE_LEFT(a, s); \
|
||||
a += b; \
|
||||
}
|
||||
#define HH(a, b, c, d, x, s, ac) \
|
||||
{ \
|
||||
a += H(b, c, d) + x + ac; \
|
||||
a = ROTATE_LEFT(a, s); \
|
||||
a += b; \
|
||||
}
|
||||
#define II(a, b, c, d, x, s, ac) \
|
||||
{ \
|
||||
a += I(b, c, d) + x + ac; \
|
||||
a = ROTATE_LEFT(a, s); \
|
||||
a += b; \
|
||||
}
|
||||
void MD5Init(MD5_CTX *context);
|
||||
void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen);
|
||||
void MD5Final(MD5_CTX *context, unsigned char digest[16]);
|
||||
void MD5Transform(unsigned int state[4], unsigned char block[64]);
|
||||
void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len);
|
||||
void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len);
|
||||
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
unsigned char PADDING[] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
void MD5Init(MD5_CTX *context)
|
||||
{
|
||||
context->count[0] = 0;
|
||||
context->count[1] = 0;
|
||||
context->state[0] = 0x67452301;
|
||||
context->state[1] = 0xEFCDAB89;
|
||||
context->state[2] = 0x98BADCFE;
|
||||
context->state[3] = 0x10325476;
|
||||
}
|
||||
void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen)
|
||||
{
|
||||
unsigned int i = 0, index = 0, partlen = 0;
|
||||
index = (context->count[0] >> 3) & 0x3F;
|
||||
partlen = 64 - index;
|
||||
context->count[0] += inputlen << 3;
|
||||
if (context->count[0] < (inputlen << 3))
|
||||
context->count[1]++;
|
||||
context->count[1] += inputlen >> 29;
|
||||
|
||||
if (inputlen >= partlen)
|
||||
{
|
||||
memcpy(&context->buffer[index], input, partlen);
|
||||
MD5Transform(context->state, context->buffer);
|
||||
for (i = partlen; i + 64 <= inputlen; i += 64)
|
||||
MD5Transform(context->state, &input[i]);
|
||||
index = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 0;
|
||||
}
|
||||
memcpy(&context->buffer[index], &input[i], inputlen - i);
|
||||
}
|
||||
void MD5Final(MD5_CTX *context, unsigned char digest[16])
|
||||
{
|
||||
unsigned int index = 0, padlen = 0;
|
||||
unsigned char bits[8];
|
||||
index = (context->count[0] >> 3) & 0x3F;
|
||||
padlen = (index < 56) ? (56 - index) : (120 - index);
|
||||
MD5Encode(bits, context->count, 8);
|
||||
MD5Update(context, PADDING, padlen);
|
||||
MD5Update(context, bits, 8);
|
||||
MD5Encode(digest, context->state, 16);
|
||||
}
|
||||
void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len)
|
||||
{
|
||||
unsigned int i = 0, j = 0;
|
||||
while (j < len)
|
||||
{
|
||||
output[j] = input[i] & 0xFF;
|
||||
output[j + 1] = (input[i] >> 8) & 0xFF;
|
||||
output[j + 2] = (input[i] >> 16) & 0xFF;
|
||||
output[j + 3] = (input[i] >> 24) & 0xFF;
|
||||
i++;
|
||||
j += 4;
|
||||
}
|
||||
}
|
||||
void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len)
|
||||
{
|
||||
unsigned int i = 0, j = 0;
|
||||
while (j < len)
|
||||
{
|
||||
output[i] = (input[j]) |
|
||||
(input[j + 1] << 8) |
|
||||
(input[j + 2] << 16) |
|
||||
(input[j + 3] << 24);
|
||||
i++;
|
||||
j += 4;
|
||||
}//-----------------------------------------@OQMODs---------------------------------------------
|
||||
}
|
||||
void MD5Transform(unsigned int state[4], unsigned char block[64])
|
||||
{
|
||||
unsigned int a = state[0];
|
||||
unsigned int b = state[1];
|
||||
unsigned int c = state[2];
|
||||
unsigned int d = state[3];
|
||||
unsigned int x[64];
|
||||
MD5Decode(x, block, 64);
|
||||
FF(a, b, c, d, x[0], 7, 0xd76aa478);
|
||||
FF(d, a, b, c, x[1], 12, 0xe8c7b756);
|
||||
FF(c, d, a, b, x[2], 17, 0x242070db);
|
||||
FF(b, c, d, a, x[3], 22, 0xc1bdceee);
|
||||
FF(a, b, c, d, x[4], 7, 0xf57c0faf);
|
||||
FF(d, a, b, c, x[5], 12, 0x4787c62a);
|
||||
FF(c, d, a, b, x[6], 17, 0xa8304613);
|
||||
FF(b, c, d, a, x[7], 22, 0xfd469501);
|
||||
FF(a, b, c, d, x[8], 7, 0x698098d8);
|
||||
FF(d, a, b, c, x[9], 12, 0x8b44f7af);
|
||||
FF(c, d, a, b, x[10], 17, 0xffff5bb1);
|
||||
FF(b, c, d, a, x[11], 22, 0x895cd7be);
|
||||
FF(a, b, c, d, x[12], 7, 0x6b901122);
|
||||
FF(d, a, b, c, x[13], 12, 0xfd987193);
|
||||
FF(c, d, a, b, x[14], 17, 0xa679438e);
|
||||
FF(b, c, d, a, x[15], 22, 0x49b40821);
|
||||
|
||||
GG(a, b, c, d, x[1], 5, 0xf61e2562);
|
||||
GG(d, a, b, c, x[6], 9, 0xc040b340);
|
||||
GG(c, d, a, b, x[11], 14, 0x265e5a51);
|
||||
GG(b, c, d, a, x[0], 20, 0xe9b6c7aa);
|
||||
GG(a, b, c, d, x[5], 5, 0xd62f105d);
|
||||
GG(d, a, b, c, x[10], 9, 0x2441453);
|
||||
GG(c, d, a, b, x[15], 14, 0xd8a1e681);
|
||||
GG(b, c, d, a, x[4], 20, 0xe7d3fbc8);
|
||||
GG(a, b, c, d, x[9], 5, 0x21e1cde6);
|
||||
GG(d, a, b, c, x[14], 9, 0xc33707d6);
|
||||
GG(c, d, a, b, x[3], 14, 0xf4d50d87);
|
||||
GG(b, c, d, a, x[8], 20, 0x455a14ed);
|
||||
GG(a, b, c, d, x[13], 5, 0xa9e3e905);
|
||||
GG(d, a, b, c, x[2], 9, 0xfcefa3f8);
|
||||
GG(c, d, a, b, x[7], 14, 0x676f02d9);
|
||||
GG(b, c, d, a, x[12], 20, 0x8d2a4c8a);
|
||||
|
||||
HH(a, b, c, d, x[5], 4, 0xfffa3942);
|
||||
HH(d, a, b, c, x[8], 11, 0x8771f681);
|
||||
HH(c, d, a, b, x[11], 16, 0x6d9d6122);
|
||||
HH(b, c, d, a, x[14], 23, 0xfde5380c);
|
||||
HH(a, b, c, d, x[1], 4, 0xa4beea44);
|
||||
HH(d, a, b, c, x[4], 11, 0x4bdecfa9);
|
||||
HH(c, d, a, b, x[7], 16, 0xf6bb4b60);
|
||||
HH(b, c, d, a, x[10], 23, 0xbebfbc70);
|
||||
HH(a, b, c, d, x[13], 4, 0x289b7ec6);
|
||||
HH(d, a, b, c, x[0], 11, 0xeaa127fa);
|
||||
HH(c, d, a, b, x[3], 16, 0xd4ef3085);
|
||||
HH(b, c, d, a, x[6], 23, 0x4881d05);
|
||||
HH(a, b, c, d, x[9], 4, 0xd9d4d039);
|
||||
HH(d, a, b, c, x[12], 11, 0xe6db99e5);
|
||||
HH(c, d, a, b, x[15], 16, 0x1fa27cf8);
|
||||
HH(b, c, d, a, x[2], 23, 0xc4ac5665);
|
||||
|
||||
II(a, b, c, d, x[0], 6, 0xf4292244);
|
||||
II(d, a, b, c, x[7], 10, 0x432aff97);
|
||||
II(c, d, a, b, x[14], 15, 0xab9423a7);
|
||||
II(b, c, d, a, x[5], 21, 0xfc93a039);
|
||||
II(a, b, c, d, x[12], 6, 0x655b59c3);
|
||||
II(d, a, b, c, x[3], 10, 0x8f0ccc92);
|
||||
II(c, d, a, b, x[10], 15, 0xffeff47d);
|
||||
II(b, c, d, a, x[1], 21, 0x85845dd1);
|
||||
II(a, b, c, d, x[8], 6, 0x6fa87e4f);
|
||||
II(d, a, b, c, x[15], 10, 0xfe2ce6e0);
|
||||
II(c, d, a, b, x[6], 15, 0xa3014314);
|
||||
II(b, c, d, a, x[13], 21, 0x4e0811a1);
|
||||
II(a, b, c, d, x[4], 6, 0xf7537e82);
|
||||
II(d, a, b, c, x[11], 10, 0xbd3af235);
|
||||
II(c, d, a, b, x[2], 15, 0x2ad7d2bb);
|
||||
II(b, c, d, a, x[9], 21, 0xeb86d391);
|
||||
state[0] += a;
|
||||
state[1] += b;
|
||||
state[2] += c;
|
||||
state[3] += d;
|
||||
}
|
||||
//-----------------------------------------@OQMODs---------------------------------------------
|
||||
static char find_pos(char ch);
|
||||
|
||||
const char *getHEX(const char *string)
|
||||
{
|
||||
char chs;
|
||||
char *ret;
|
||||
char *str;
|
||||
if (!string || (ret = str = (char *)malloc(strlen(string) * 2 + 1)) == NULL)
|
||||
return NULL;
|
||||
while (*string)
|
||||
{
|
||||
chs = (*string & 0XF0) >> 4;
|
||||
if (chs > 9)
|
||||
*str = chs - 10 + 'A'; //chs - 10 + 'A'
|
||||
else
|
||||
*str = chs + '0';
|
||||
str++;
|
||||
chs = *string & 0X0F;
|
||||
if (chs > 9)
|
||||
*str = chs - 10 + 'A'; //chs - 10 + 'A'
|
||||
else
|
||||
*str = chs + '0';
|
||||
str++;
|
||||
string++;
|
||||
}
|
||||
*str = '\0';
|
||||
return ret;
|
||||
}
|
||||
|
||||
//-----------------------------------------@OQMODs---------------------------------------------
|
||||
char *加64(const char* data)
|
||||
{
|
||||
int data_len = strlen(data);
|
||||
int prepare = 0;
|
||||
int ret_len;
|
||||
int temp = 0;
|
||||
char *ret = NULL;
|
||||
char *f = NULL;
|
||||
int tmp = 0;
|
||||
char changed[4];
|
||||
int i = 0;
|
||||
ret_len = data_len / 3;
|
||||
temp = data_len % 3;
|
||||
if (temp > 0)
|
||||
{
|
||||
ret_len += 1;
|
||||
}
|
||||
ret_len = ret_len*4 + 1;
|
||||
ret = (char *)malloc(ret_len);
|
||||
|
||||
if ( ret == NULL)
|
||||
{
|
||||
printf("No enough memory.\n");
|
||||
exit(0);
|
||||
}
|
||||
memset(ret, 0, ret_len);
|
||||
f = ret;
|
||||
while (tmp < data_len)
|
||||
{
|
||||
temp = 0;
|
||||
prepare = 0;
|
||||
memset(changed, '\0', 4);
|
||||
while (temp < 3)
|
||||
{
|
||||
//printf("tmp = %d\n", tmp);
|
||||
if (tmp >= data_len)
|
||||
{
|
||||
break;
|
||||
}
|
||||
prepare = ((prepare << 8) | (data[tmp] & 0xFF));
|
||||
tmp++;
|
||||
temp++;
|
||||
}
|
||||
prepare = (prepare<<((3-temp)*8));
|
||||
//printf("before for : temp = %d, prepare = %d\n", temp, prepare);
|
||||
for (i = 0; i < 4 ;i++ )
|
||||
{
|
||||
if (temp < i)
|
||||
{
|
||||
changed[i] = 0x40;
|
||||
}
|
||||
else
|
||||
{
|
||||
changed[i] = (prepare>>((3-i)*6)) & 0x3F;
|
||||
}
|
||||
*f = BQAQSQEQ[changed[i]];
|
||||
//printf("%.2X", changed[i]);
|
||||
f++;
|
||||
}
|
||||
}
|
||||
*f = '\0';
|
||||
char *a[3]={"","==","="};
|
||||
sprintf(ret,"%s%s",ret,a[strlen(data)%3]);
|
||||
return ret;
|
||||
|
||||
}
|
||||
/* */
|
||||
static char find_pos(char ch)
|
||||
{
|
||||
char *ptr = (char*)strrchr(BQAQSQEQ, ch);//the last position (the only) in base[]
|
||||
return (ptr - BQAQSQEQ);
|
||||
}
|
||||
/* */
|
||||
char *解64(const char *data)
|
||||
{
|
||||
int data_len = strlen(data);
|
||||
int ret_len = (data_len / 4) * 3;
|
||||
int equal_count = 0;
|
||||
char *ret = NULL;
|
||||
char *f = NULL;
|
||||
int tmp = 0;
|
||||
int temp = 0;
|
||||
char need[3];
|
||||
int prepare = 0;
|
||||
int i = 0;
|
||||
if (*(data + data_len - 1) == '=')
|
||||
{
|
||||
equal_count += 1;
|
||||
}
|
||||
if (*(data + data_len - 2) == '=')
|
||||
{
|
||||
equal_count += 1;
|
||||
}
|
||||
if (*(data + data_len - 3) == '=')
|
||||
{//seems impossible
|
||||
equal_count += 1;
|
||||
}
|
||||
switch (equal_count)
|
||||
{
|
||||
case 0:
|
||||
ret_len += 4;//3 + 1 [1 for NULL]
|
||||
break;
|
||||
case 1:
|
||||
ret_len += 4;//Ceil((6*3)/8)+1
|
||||
break;
|
||||
case 2:
|
||||
ret_len += 3;//Ceil((6*2)/8)+1
|
||||
break;
|
||||
case 3:
|
||||
ret_len += 2;//Ceil((6*1)/8)+1
|
||||
break;
|
||||
}
|
||||
ret = (char *)malloc(ret_len);
|
||||
if (ret == NULL)
|
||||
{
|
||||
printf("No enough memory.\n");
|
||||
exit(0);
|
||||
}
|
||||
memset(ret, 0, ret_len);
|
||||
f = ret;
|
||||
while (tmp < (data_len - equal_count))
|
||||
{
|
||||
temp = 0;
|
||||
prepare = 0;
|
||||
memset(need, 0, 4);
|
||||
while (temp < 4)
|
||||
{
|
||||
if (tmp >= (data_len - equal_count))
|
||||
{
|
||||
break;
|
||||
}
|
||||
prepare = (prepare << 6) | (find_pos(data[tmp]));
|
||||
temp++;
|
||||
tmp++;
|
||||
}
|
||||
prepare = prepare << ((4-temp) * 6);
|
||||
for (i=0; i<3 ;i++ )
|
||||
{
|
||||
if (i == temp)
|
||||
{
|
||||
break;
|
||||
}
|
||||
*f = (char)((prepare>>((2-i)*8)) & 0xFF);
|
||||
f++;
|
||||
}
|
||||
}
|
||||
*f = '\0';
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------@OQMODs---------------------------------------------
|
||||
char *itoa(int num, char *str, int radix)
|
||||
{
|
||||
char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
unsigned unum;
|
||||
int i = 0, j, k;
|
||||
if (radix == 10 && num < 0)
|
||||
{
|
||||
unum = (unsigned)-num;
|
||||
str[i++] = '-';
|
||||
}
|
||||
else
|
||||
unum = (unsigned)num;
|
||||
do
|
||||
{
|
||||
str[i++] = index[unum % (unsigned)radix];
|
||||
unum /= radix;
|
||||
|
||||
} while (unum);
|
||||
|
||||
str[i] = '\0';
|
||||
|
||||
//将顺序调整过来
|
||||
if (str[0] == '-')
|
||||
k = 1;
|
||||
else
|
||||
k = 0;
|
||||
|
||||
char temp;
|
||||
for (j = k; j <= (i - 1) / 2; j++)
|
||||
{
|
||||
temp = str[j];
|
||||
str[j] = str[i - 1 + k - j];
|
||||
str[i - 1 + k - j] = temp;
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
const char *获取时间戳( char sj[13])
|
||||
{
|
||||
time_t t = time(NULL);
|
||||
struct tm *mtime = localtime(&t);
|
||||
//char sj[13];
|
||||
char *sjzz = sj;
|
||||
itoa(mtime->tm_year + 1900, sjzz, 10);
|
||||
sjzz += 4;
|
||||
if (mtime->tm_mon + 1 < 10)
|
||||
{ //月
|
||||
*sjzz = '0';
|
||||
sjzz++;
|
||||
itoa(mtime->tm_mon + 1, sjzz, 10);
|
||||
sjzz++;
|
||||
}
|
||||
else
|
||||
{
|
||||
itoa(mtime->tm_mon + 1, sjzz, 10);
|
||||
sjzz += 2;
|
||||
}
|
||||
if (mtime->tm_mday < 10)
|
||||
{ //日
|
||||
*sjzz = '0';
|
||||
sjzz++;
|
||||
itoa(mtime->tm_mday, sjzz, 10);
|
||||
sjzz++;
|
||||
}
|
||||
else
|
||||
{
|
||||
itoa(mtime->tm_mday, sjzz, 10);
|
||||
sjzz += 2;
|
||||
}
|
||||
if (mtime->tm_hour < 10)
|
||||
{ //小时
|
||||
*sjzz = '0';
|
||||
sjzz++;
|
||||
itoa(mtime->tm_hour, sjzz, 10);
|
||||
sjzz++;
|
||||
}
|
||||
else
|
||||
{
|
||||
itoa(mtime->tm_hour, sjzz, 10);
|
||||
sjzz += 2;
|
||||
}
|
||||
if (mtime->tm_min < 10)
|
||||
{ //分钟
|
||||
*sjzz = '0';
|
||||
sjzz++;
|
||||
itoa(mtime->tm_min, sjzz, 10);
|
||||
sjzz++;
|
||||
}
|
||||
else
|
||||
{
|
||||
itoa(mtime->tm_min, sjzz, 10);
|
||||
sjzz += 2;
|
||||
}
|
||||
return sj;
|
||||
}
|
||||
|
||||
char *获取MD5(char yz[128],char yzmd5[32])
|
||||
{
|
||||
MD5_CTX md5c;
|
||||
MD5Init(&md5c);
|
||||
unsigned char decrypt[16];
|
||||
MD5Update(&md5c, (unsigned char*)yz, strlen(yz));
|
||||
MD5Final(&md5c, decrypt);
|
||||
//char yzmd5[32] = {0};
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
sprintf(&yzmd5[i * 2], "%02x", decrypt[i]);
|
||||
}
|
||||
return yzmd5;
|
||||
}//-----------------------------------------@OQMODs---------------------------------------------
|
||||
@@ -0,0 +1,407 @@
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <vector>
|
||||
#include <time.h>
|
||||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
#include <cstring>
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
char* strstrstr(char* str, char* text, char* rear);//变态级的函数,看了可能会崩溃
|
||||
char* httppost(char* hostname, char* url, char* cs);//POST方法
|
||||
char* httpget(const char* hostname, char* url);//GET方法
|
||||
char* getip(char* hostname);//域名转换IP
|
||||
int hextoint(char* hex);//16进制字符串转整数
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
char* httppost(char* hostname, char* url, char* cs){
|
||||
// sock句柄
|
||||
int sockfd;
|
||||
struct sockaddr_in serveraddr;
|
||||
//两个是同一个类型,可混用,但是会警告
|
||||
//int addrlen = sizeof(serveraddr);
|
||||
socklen_t addrlen = sizeof(serveraddr);
|
||||
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
|
||||
//printf("创建网络连接失败---socket error!\n");
|
||||
return NULL;
|
||||
}
|
||||
//C4droid的GCC没有这个函数,编译会报错
|
||||
//bzero(&serveraddr, addrlen);
|
||||
//可以使用这个函数
|
||||
memset(&serveraddr,0,addrlen);
|
||||
serveraddr.sin_family = AF_INET;
|
||||
//端口80
|
||||
serveraddr.sin_port = htons(80);
|
||||
struct hostent* host;
|
||||
host = gethostbyname(hostname);
|
||||
if (host == NULL){
|
||||
printf("无法解析域名\n");
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
struct in_addr ip = *((struct in_addr *)host->h_addr);
|
||||
//printf("ip:%s\n",inet_ntoa(ip));
|
||||
serveraddr.sin_addr = ip;
|
||||
if (connect(sockfd, (struct sockaddr*) & serveraddr, addrlen) < 0){
|
||||
//printf("连接到服务器失败,connect error!\n");
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
//因为懒,所以char[2048]
|
||||
//可以通过strlen获取参数长度来动态申请内存
|
||||
char postxyt[2048];
|
||||
char postsjlen[5];
|
||||
// 发送数据
|
||||
//32位要用 "%u" 经测试发现还是long最稳定
|
||||
//顺利通过 GCC,arm-linux-gcc,arm-linux-gnueabi-gcc,安卓jni 编译 无警告
|
||||
#if __SIZEOF_LONG__ == 8
|
||||
sprintf(postsjlen, "%lu", strlen(cs));
|
||||
#else
|
||||
sprintf(postsjlen, "%u", strlen(cs));
|
||||
#endif
|
||||
memset(postxyt, 0, 2048);
|
||||
// 追加字符串(请求协议头)
|
||||
//个人感觉strcat函数比较低效
|
||||
//用char指针和strcpy函数会比较快
|
||||
sprintf(postxyt,"POST /%s HTTP/1.1\r\nHost: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %ld\r\n\r\n%s\r\n\r\n",url,hostname,strlen(cs),cs);
|
||||
//别问,问就是 “一切皆文件”
|
||||
/*
|
||||
if (write(sockfd, postxyt, strlen(postxyt)) == -1){
|
||||
//printf("发送失败!错误代码:%d,错误信息:%s\n", errno, strerror(errno));
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}*/
|
||||
if (send(sockfd, postxyt, strlen(postxyt),0) == -1){
|
||||
printf("%d,%s\n", errno, strerror(errno));
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
fd_set fds;
|
||||
struct timeval tv = { 3,0 }; //select等待3秒,3秒轮询,要非阻塞就置0
|
||||
//非阻塞需要循环
|
||||
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
|
||||
FD_SET(sockfd, &fds); //添加描述符
|
||||
|
||||
if (select(sockfd + 1, &fds, NULL, NULL, &tv) < 1){
|
||||
//非阻塞时使用continue;
|
||||
//-1错误
|
||||
//0无写入数据
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (FD_ISSET(sockfd, &fds)) { //测试sock是否可读,即是否网络上有数据
|
||||
char xyt[1024];
|
||||
char* xytzz = xyt;
|
||||
char* xytmaxlen = xyt + 1023;
|
||||
int readlen;
|
||||
while (readlen = read(sockfd, xytzz, 1)){
|
||||
if(*xytzz == '\n'){
|
||||
//printf("匹配到一个\\n\n");
|
||||
if(strncmp(xytzz - 3,"\r\n\r",3) == 0){
|
||||
*++xytzz = '\0';
|
||||
//printf("嗨呀,完全匹配,好开心\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
xytzz++;
|
||||
if(xytmaxlen == xytzz){
|
||||
//printf("什么吊毛协议头这么长\n");
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if(!readlen){
|
||||
//printf("服务器断开了连接,并未发送任何数据。\n");
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
//printf("%s\n--\n",xyt);
|
||||
char* xylen = strstrstr(xyt,"Content-Length: ","\n");
|
||||
char* xyzw;
|
||||
if(xylen == NULL){
|
||||
//如果读取正文长度失败则进入分段读取模式
|
||||
char hexlen[8];
|
||||
char* hex = hexlen;
|
||||
do{
|
||||
read(sockfd, hex, 1);
|
||||
}while(*hex++ != '\n');
|
||||
*hex = '\0';
|
||||
int rdlen = hextoint(hexlen);
|
||||
if(rdlen == 0){
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
//rdlen++;
|
||||
xyzw = (char*)malloc(rdlen + 2);//把\r\n读出来
|
||||
read(sockfd, xyzw, rdlen + 2);//方便下面读取区块信息
|
||||
//xyzw[rdlen] = '\0';
|
||||
//读取下一块内容
|
||||
while(1){
|
||||
hex = hexlen;
|
||||
do{
|
||||
read(sockfd, hex, 1);
|
||||
}while(*hex++ != '\n');
|
||||
*hex = '\0';
|
||||
int chlen = hextoint(hexlen);
|
||||
//判断当前区块是否为0
|
||||
if(chlen == 0)break;
|
||||
rdlen += chlen;
|
||||
xyzw = (char*)realloc(xyzw,rdlen + 2);
|
||||
char* xrzz = xyzw + rdlen - chlen;
|
||||
read(sockfd, xrzz, chlen + 2);
|
||||
//xyzw[rdlen] = '\0';
|
||||
}
|
||||
xyzw[rdlen] = '\0';
|
||||
}else{
|
||||
//得到正文长度,一次性读取 申请内存
|
||||
int xyzwlen = atoi(xylen);
|
||||
free(xylen);
|
||||
//printf("正文共%d字节\n",xyzwlen);
|
||||
xyzw = (char*)malloc(xyzwlen + 1);
|
||||
readlen = read(sockfd, xyzw, xyzwlen);//接受网络数据
|
||||
xyzw[readlen] = '\0';
|
||||
//printf("读取了%d字节\n",readlen);
|
||||
}
|
||||
close(sockfd);
|
||||
return xyzw;
|
||||
}
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* httpget(const char* hostname, char* url){
|
||||
// sock句柄
|
||||
int sockfd;
|
||||
struct sockaddr_in serveraddr;
|
||||
//两个是同一个类型,可混用,但是会警告
|
||||
//int addrlen = sizeof(serveraddr);
|
||||
socklen_t addrlen = sizeof(serveraddr);
|
||||
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
|
||||
//printf("创建网络连接失败---socket error!\n");
|
||||
return NULL;
|
||||
}
|
||||
//C4droid的GCC没有这个函数,编译会报错
|
||||
//bzero(&serveraddr, addrlen);
|
||||
//可以使用这个函数
|
||||
memset(&serveraddr,0,addrlen);
|
||||
serveraddr.sin_family = AF_INET;
|
||||
//端口80
|
||||
serveraddr.sin_port = htons(80);
|
||||
struct hostent* host;
|
||||
host = gethostbyname(hostname);
|
||||
if (host == NULL){
|
||||
//printf("无法解析域名\n");
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
struct in_addr ip = *((struct in_addr *)host->h_addr);
|
||||
//printf("ip:%s\n",inet_ntoa(ip));
|
||||
serveraddr.sin_addr = ip;
|
||||
if (connect(sockfd, (struct sockaddr*) & serveraddr, addrlen) < 0){
|
||||
//printf("连接到服务器失败,connect error!\n");
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
//因为懒,所以char[2048]
|
||||
//可以通过strlen获取参数长度来动态申请内存
|
||||
char postxyt[2048];
|
||||
memset(postxyt, 0, 2048);
|
||||
// 追加字符串(请求协议头)
|
||||
//个人感觉strcat函数比较低效
|
||||
//用char指针和strcpy函数会比较快
|
||||
sprintf(postxyt,"GET /%s HTTP/1.1\r\nHost: %s\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n",url,hostname);
|
||||
//别问,问就是 “一切皆文件”
|
||||
/*
|
||||
if (write(sockfd, postxyt, strlen(postxyt)) == -1){
|
||||
//printf("发送失败!错误代码:%d,错误信息:%s\n", errno, strerror(errno));
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}*/
|
||||
if (send(sockfd, postxyt, strlen(postxyt),0) == -1){
|
||||
printf("%d%s\n", errno, strerror(errno));
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
fd_set fds;
|
||||
struct timeval tv = { 3,0 }; //select等待3秒,3秒轮询,要非阻塞就置0
|
||||
//非阻塞需要循环
|
||||
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
|
||||
FD_SET(sockfd, &fds); //添加描述符
|
||||
|
||||
if (select(sockfd + 1, &fds, NULL, NULL, &tv) < 1){
|
||||
//非阻塞时使用continue;
|
||||
//-1错误
|
||||
//0无写入数据
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (FD_ISSET(sockfd, &fds)) { //测试sock是否可读,即是否网络上有数据
|
||||
char xyt[1024];
|
||||
char* xytzz = xyt;
|
||||
char* xytmaxlen = xyt + 1023;
|
||||
int readlen;
|
||||
while (readlen = read(sockfd, xytzz, 1)){
|
||||
if(*xytzz == '\n'){
|
||||
//printf("匹配到一个\\n\n");
|
||||
if(strncmp(xytzz - 3,"\r\n\r",3) == 0){
|
||||
*++xytzz = '\0';
|
||||
//printf("嗨呀,完全匹配,好开心\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
xytzz++;
|
||||
if(xytmaxlen == xytzz){
|
||||
//printf("什么吊毛协议头这么长\n%s\n",xyt);
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if(!readlen){
|
||||
//printf("服务器断开了连接,并未发送任何数据。\n");
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//printf("%s\n--\n",xyt);
|
||||
char* xylen = strstrstr(xyt,"Content-Length: ","\n");
|
||||
char* xyzw;
|
||||
if(xylen == NULL){
|
||||
//如果读取正文长度失败则进入分段读取模式
|
||||
char hexlen[8];
|
||||
char* hex = hexlen;
|
||||
do{
|
||||
read(sockfd, hex, 1);
|
||||
}while(*hex++ != '\n');
|
||||
*hex = '\0';
|
||||
int rdlen = hextoint(hexlen);
|
||||
if(rdlen == 0){
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
//rdlen++;
|
||||
xyzw = (char*)malloc(rdlen + 2);//把\r\n读出来
|
||||
read(sockfd, xyzw, rdlen + 2);//方便下面读取区块信息
|
||||
//xyzw[rdlen] = '\0';
|
||||
//读取下一块内容
|
||||
while(1){
|
||||
hex = hexlen;
|
||||
do{
|
||||
read(sockfd, hex, 1);
|
||||
}while(*hex++ != '\n');
|
||||
*hex = '\0';
|
||||
int chlen = hextoint(hexlen);
|
||||
//判断当前区块是否为0
|
||||
if(chlen == 0)break;
|
||||
rdlen += chlen;
|
||||
xyzw = (char*)realloc(xyzw,rdlen + 2);
|
||||
char* xrzz = xyzw + rdlen - chlen;
|
||||
read(sockfd, xrzz, chlen + 2);
|
||||
//xyzw[rdlen] = '\0';
|
||||
}
|
||||
xyzw[rdlen] = '\0';
|
||||
}else{
|
||||
//得到正文长度,一次性读取 申请内存
|
||||
int xyzwlen = atoi(xylen);
|
||||
free(xylen);
|
||||
//printf("正文共%d字节\n",xyzwlen);
|
||||
xyzw = (char*)malloc(xyzwlen + 1);
|
||||
readlen = read(sockfd, xyzw, xyzwlen);//接受网络数据
|
||||
xyzw[readlen] = '\0';
|
||||
//printf("读取了%d字节\n",readlen);
|
||||
}
|
||||
close(sockfd);
|
||||
return xyzw;
|
||||
}
|
||||
close(sockfd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* strstrstr(char* str, char* front, char* rear){
|
||||
if(!str || !front || !rear)return NULL;//如果你不传NULL,我至于吗
|
||||
char* s;
|
||||
char* t;
|
||||
while(*str) {
|
||||
s = str;
|
||||
t = front;
|
||||
while (*s == *t) {
|
||||
s++;
|
||||
t++;
|
||||
if (!*t) {
|
||||
str = s;
|
||||
char* old = str;
|
||||
do{
|
||||
s = str;
|
||||
t = rear;
|
||||
while (*s == *t) {
|
||||
s++;
|
||||
t++;
|
||||
if (!*t) {
|
||||
int charlen = str - old;
|
||||
char* newstr = (char*)malloc(charlen + 1);
|
||||
strncpy(newstr, old, charlen);
|
||||
//使用Visual studio编程时会警告strncpy函数存在风险,使用strncpy_s替换之
|
||||
//strncpy_s(newstr, charlen + 1,old, charlen);
|
||||
newstr[charlen] = '\0';
|
||||
return newstr;
|
||||
}
|
||||
}
|
||||
str++;
|
||||
}while(*str);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
str++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* getip(char* hostname) {
|
||||
//不多bb,面向百度编程
|
||||
struct hostent* host;
|
||||
host = gethostbyname(hostname);
|
||||
if (host == NULL){
|
||||
perror("cannot get host by hostname");
|
||||
return NULL;
|
||||
}
|
||||
return inet_ntoa(*((struct in_addr *)host->h_addr));
|
||||
}
|
||||
|
||||
int hextoint(char * hex){
|
||||
int value = 0;
|
||||
while (*hex){
|
||||
if (*hex >= 'A' && *hex <= 'F')
|
||||
value = (*hex - 55) + 16 * value;
|
||||
else if (*hex >= 'a' && *hex <= 'f')
|
||||
value = (*hex - 87) + 16 * value;
|
||||
else if (*hex >= '0' && *hex <= '9')
|
||||
value = (*hex - 48) + 16 * value;
|
||||
else{
|
||||
return value;
|
||||
}
|
||||
hex++;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
Executable
+126
@@ -0,0 +1,126 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <vector>
|
||||
#include <time.h>
|
||||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
int ping(char *svrip)
|
||||
{
|
||||
int i = 0;
|
||||
while (i < 3)
|
||||
{
|
||||
pid_t pid;
|
||||
if ((pid = vfork()) < 0)
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
else if (pid == 0)
|
||||
{
|
||||
if (execlp("ping", "ping", "-c", "1", svrip, (char *)0) < 0)
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
int stat;
|
||||
//waitpid(pid, &stat, 0);
|
||||
|
||||
if (stat == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
sleep(3);
|
||||
i++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *Path_str(char *path)
|
||||
{
|
||||
FILE *fp;
|
||||
if ((fp = fopen(path, "r")) == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
fseek(fp, 0, SEEK_END);
|
||||
int filesize = ftell(fp);
|
||||
char *str;
|
||||
str = (char *)malloc(filesize);
|
||||
rewind(fp);
|
||||
fread(str, 1, filesize, fp);
|
||||
str[filesize] = '\0';
|
||||
fclose(fp);
|
||||
return str;
|
||||
}
|
||||
|
||||
char *post(char *url, char *str)
|
||||
{
|
||||
char cmd[512] = "curl -sd '";
|
||||
strcat(cmd, str);
|
||||
strcat(cmd, "' ");
|
||||
strcat(cmd, url);
|
||||
FILE *fp = popen(cmd, "r");
|
||||
if (fp == NULL)
|
||||
{
|
||||
return "NULL";
|
||||
}
|
||||
char *ret;
|
||||
ret = (char *)malloc(sizeof(char) * 1024);
|
||||
char buf[1024];
|
||||
while (fgets(buf, 1024, fp) != NULL)
|
||||
strcat(ret, buf);
|
||||
if (pclose(fp) == -1)
|
||||
{
|
||||
return "NULL";
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
char* json_str(char* str, char* front, char* rear){
|
||||
if(!str || !front || !rear)return NULL;char* s;char* t;while(*str) {s = str;t = front;while (*s == *t) {s++;t++;if (!*t) {str = s;char* old = str;do{s = str;t = rear;while (*s == *t) {s++;t++;if (!*t) {int charlen = str - old;char* newstr = (char*)malloc(charlen + 1);strncpy(newstr, old, charlen);newstr[charlen] = '\0';return newstr;}}str++;}while(*str);return NULL;}}str++;}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void del_chr(char *s, char ch)
|
||||
{
|
||||
char *t = s; // 目标指针先指向原串头
|
||||
while (*s != '\0') // 遍历字符串s
|
||||
{
|
||||
if (*s != ch) // 如果当前字符不是要删除的,则保存到目标串中
|
||||
*t++ = *s;
|
||||
s++; // 检查下一个字符
|
||||
}
|
||||
*t = '\0'; // 置目标串结束符。
|
||||
}
|
||||
|
||||
long long GetTick(char *str_time)
|
||||
{
|
||||
/* struct tm stm;
|
||||
int iY, iM, iD, iH, iMin, iS;
|
||||
|
||||
memset(&stm,0,sizeof(stm));
|
||||
|
||||
iY = atoi(str_time);
|
||||
iM = atoi(str_time+5);
|
||||
iD = atoi(str_time+8);
|
||||
iH = atoi(str_time+11);
|
||||
iMin = atoi(str_time+14);
|
||||
iS = atoi(str_time+17);
|
||||
|
||||
stm.tm_year=iY-1900;
|
||||
stm.tm_mon=iM-1;
|
||||
stm.tm_mday=iD;
|
||||
stm.tm_hour=iH;
|
||||
stm.tm_min=iMin;
|
||||
stm.tm_sec=iS;
|
||||
return mktime(&stm);*/
|
||||
struct tm timeinfo;
|
||||
strptime(str_time, "%Y-%m-%d %H:%M:%S", &timeinfo);
|
||||
time_t timeStamp = mktime(&timeinfo);
|
||||
return timeStamp;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user