#include "utils.h" #include #include #include #include #include #include #include #include #include #include #include "cJSON.h" #include char header[1024] = {0}; char send_request[1024] = {0}; char send_end[1024] = {0}; char http_boundary[64] = {0}; unsigned long get_file_size(const char *path) // 获取文件大小 { unsigned long filesize = -1; struct stat statbuff; if (stat(path, &statbuff) < 0) { return filesize; } else { filesize = statbuff.st_size; } return filesize; } int create_socket(const char *ip, const unsigned int port) { int cfd = -1; struct sockaddr_in s_addr, c_addr; cfd = socket(AF_INET, SOCK_STREAM, 0); if (-1 == cfd) { printf("socket create fail\n"); return -1; } bzero(&s_addr, sizeof(struct sockaddr_in)); s_addr.sin_family = AF_INET; s_addr.sin_addr.s_addr = inet_addr(ip); s_addr.sin_port = htons(port); if (-1 == connect(cfd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr))) { printf("conect failed\n"); return -1; } return cfd; } void close_socket(int sockfd) { if (sockfd < 0) { return; } close(sockfd); } int post_json(const char *ip, const unsigned int port, const char *host, const char *uri, cJSON *data) { int cfd = -1, recbytes = -1; struct sockaddr_in s_addr, c_addr; char buffer[1024 * 10] = {0}; cfd = create_socket(ip, port); if (cfd < 0) { printf("create sockfd failed\n"); return -1; } char *strs = cJSON_Print(data); int totalsize = strlen(strs); unsigned long head_len = snprintf(header, 1024, HTTP_HEAD, uri, host, "Content-Type: application/json", totalsize); // 头信息 totalsize += head_len; char *request = (char *)malloc(totalsize); // 申请内存用于存放要发送的数据 if (request == NULL) { printf("malloc request fail !\r\n"); close_socket(cfd); return -1; } request[0] = '\0'; strcat(request, header); // http头信息 strcat(request, strs); // json数据 free(strs); if (-1 == write(cfd, request, totalsize)) { printf("send http package fail!\r\n"); close_socket(cfd); return -1; } if (-1 == (recbytes = read(cfd, buffer, 10240))) { printf("read http ACK fail !\r\n"); close_socket(cfd); return -1; } buffer[recbytes] = '\0'; printf("got response %s\n", buffer); free(request); close_socket(cfd); return 0; } int post_data(const char *ip, const unsigned int port, char *host, char *uri, const char *filepath) { int cfd = -1, recbytes = -1; struct sockaddr_in s_addr, c_addr; char buffer[1024 * 10] = {0}; /* cfd = socket(AF_INET, SOCK_STREAM, 0); if (-1 == cfd) { printf("socket create fail\n"); return -1; } bzero(&s_addr, sizeof(struct sockaddr_in)); s_addr.sin_family = AF_INET; s_addr.sin_addr.s_addr = inet_addr(ip); s_addr.sin_port = htons(port); if (-1 == connect(cfd, (struct sockaddr*)&s_addr, sizeof(struct sockaddr))) { printf("conect failed\n"); return -1; } */ cfd = create_socket(ip, port); if (cfd < 0) { printf("create sockfd failed\n"); return -1; } long long int timestamp; struct timeval tv; gettimeofday(&tv, NULL); timestamp = (long long int)tv.tv_sec * 1000 + tv.tv_usec; snprintf(http_boundary, 64, "---------------------------%lld", timestamp); unsigned long totalsize = 0; unsigned long filesize = get_file_size(filepath); // 文件大小 unsigned long request_len = snprintf(send_request, 1024, UPLOAD_REQUEST, http_boundary, filepath); // 请求信息 unsigned long end_len = snprintf(send_end, 1024, "\r\n--%s--\r\n", http_boundary); // 结束信息 totalsize = filesize + request_len + end_len; char application[128] = {0}; snprintf(application, 128, "multipart/form-data; boundary=%s", http_boundary); unsigned long head_len = snprintf(header, 1024, HTTP_HEAD, uri, host, application, totalsize); // 头信息 totalsize += head_len; char *request = (char *)malloc(totalsize); // 申请内存用于存放要发送的数据 if (request == NULL) { printf("malloc request fail !\r\n"); close_socket(cfd); return -1; } request[0] = '\0'; strcat(request, header); // http头信息 strcat(request, send_request); // 文件图片请求信息 FILE *fp = fopen(filepath, "rb+"); // 打开要上传的图片 if (fp == NULL) { printf("open file fail!\r\n"); close_socket(cfd); return -1; } int readbyte = fread(request + head_len + request_len, 1, filesize, fp); // 读取上传的图片信息 if (readbyte < 1024) // 小于1024个字节 则认为图片有问题 { printf("Read picture data fail!\r\n"); close_socket(cfd); return -1; } memcpy(request + head_len + request_len + filesize, send_end, end_len); // http结束信息 /********* 发送http 请求 ***********/ if (-1 == write(cfd, request, totalsize)) { printf("send http package fail!\r\n"); close_socket(cfd); return -1; } if (-1 == (recbytes = read(cfd, buffer, 10240))) { printf("read http ACK fail !\r\n"); close_socket(cfd); return -1; } buffer[recbytes] = '\0'; printf("got response %s\n", buffer); free(request); fclose(fp); close_socket(cfd); return 0; } // outbuf should be larger than 15 digits 20060102150405\0, // 返回这个时间片里,还剩下多少秒时间 int get_current_time_gap(current_time_gap_t *gap) { time_t now; now = time(NULL); int resgap = now % TIMEGAP; gap->now = now; gap->now_gap = now - resgap; gap->gap_remaining = TIMEGAP - resgap; gap->next_gap = now - resgap + TIMEGAP; return 0; } double current_time_stamp() { time_t now; now = time(NULL); return double(now); } uint64_t convert_time_to_name(time_t now) { struct tm now_time; localtime_r(&now, &now_time); uint64_t res = ((uint64_t)(1900 + now_time.tm_year)) * 1e10 + ((uint64_t)(1 + now_time.tm_mon)) * 1e8 + ((uint64_t)now_time.tm_mday) * 1e6 + ((uint64_t)now_time.tm_hour) * 1e4 + ((uint64_t)now_time.tm_min) * 1e2 + (uint64_t)now_time.tm_sec; return res; } int read_data_from_file(const char *path, char **out_data) { FILE *fp = fopen(path, "rb"); if(fp == NULL) { printf("fopen %s fail!\n", path); return -1; } fseek(fp, 0, SEEK_END); int file_size = ftell(fp); char *data = (char *)malloc(file_size+1); data[file_size] = 0; fseek(fp, 0, SEEK_SET); if(file_size != fread(data, 1, file_size, fp)) { printf("fread %s fail!\n", path); free(data); fclose(fp); return -1; } if(fp) { fclose(fp); } *out_data = data; return file_size; }