bool RpcClient::invoke(const google::protobuf::MethodDescriptor* method, std::string& errmsg) { int service_id = method->service()->index(); int method_id = method->index(); procedure_id_t procedure_id = build_procedure_id(service_id, method_id); struct event* ev = RpcClient::_evs.get(procedure_id); struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = RpcClient::CONNECT_TIMEOUT * 1000; if (ev == NULL) { ev = event_info_create(create_tcpsocket()); if (ev == NULL) { errmsg = "faild to alloc event info"; error("faild to alloc event info, service id:%d, method id:%d", service_id, method_id); return false; } RpcClient::_evs.add(procedure_id, *ev); ev->flags = EVENT_REUSE | EVENT_WRITE; ev->fail_func = failed_callback; ev->fail_param = (void*) method; ev->send_func = invoke_callback; ev->send_param = (void*) method; if (!connect(ev, &timeout)) { errmsg = "invoke connect error"; error("invoke connect error, service id:%d, method id:%d", service_id, method_id); return false; } } else { ev->flags = EVENT_REUSE | EVENT_WRITE; ev->send_func = invoke_callback; ev->send_param = (void*) method; if (ev->status == EVENT_STATUS_ERR) { warn("arragner lose connect, try to reconnect"); ev->fd = create_tcpsocket(); ev->status = EVENT_STATUS_OK; if (!connect(ev, &timeout)) { errmsg = "invoke reconnect error"; return false; } } else { ev->status = EVENT_STATUS_OK; event_mod(_netinf, ev); } } return true; }
int connect_send(int* socket,const int ip,const unsigned short port,const char* buff,const size_t bufflen){ *socket = create_tcpsocket(); set_linger(*socket); connect_port_ip(*socket,ip,port); size_t postsend=0,tmpsend; while(postsend != bufflen){ tmpsend = write(*socket,&buff[postsend],bufflen); if(tmpsend>0){ postsend+=tmpsend; }else{ return 0; } } return postsend; }
int connect_send_close(const int ip,const unsigned short port,const char* buff,const size_t bufflen){ // return how many bytes sent int socket = create_tcpsocket(); set_linger(socket); int success = connect_port_ip(socket,ip,port); if(success) { perror("connect"); fprintf(stderr,"target:%s\n",my_ntoa(ip)); exit(1); return 1; } size_t postsend=0,tmpsend; while(postsend != bufflen){ tmpsend = write(socket,buff,bufflen); if(tmpsend>0){ postsend+=tmpsend; }else{ return postsend; } } close(socket); return postsend; }
int http_get(char **res, char *url) { if(url == NULL) { *res = NULL; return -1; } int fd; char host[256] = {0x0}; char requestpath[1024] = {0x0}; int port = 0; int ishttps = 0; int reslength = 0; int ressize = 0; int n, ret; SSL *ssl; SSL_CTX *ctx; char buf[BUF_LEN]; //parse url parse_src(url, host, requestpath, &port, &ishttps); //create socket fd = create_tcpsocket(host, port, ishttps); if(fd < 0) return -1; /* http request. */ sprintf(buf, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n",requestpath, host); if(ishttps != 1) { if(xnet_select(fd, timeout_sec, timeout_microsec, WRITE_STATUS) > 0) { /* send off the message */ write(fd, buf, strlen(buf)); } else { return -1; } while (xnet_select(fd, timeout_sec, timeout_microsec, READ_STATUS) > 0) { if ((n = read(fd, buf, BUF_LEN-1)) > 0) { buf[n] = '\0'; if(reslength == 0) { reslength += n; ressize = BUF_LEN; *res = malloc(ressize); memset(*res, 0, ressize); char *tmp; if((tmp = strstr(buf, "\r\n\r\n")) != NULL) { strcat(*res, tmp + 4); } else strcat(*res, buf); } else { reslength += n; ressize += BUF_LEN; *res = realloc(*res, ressize); strcat(*res, buf); } } else { break; } } //close the plain socket handler. close(fd); } else { SSL_load_error_strings(); SSL_library_init(); ctx = SSL_CTX_new(SSLv23_client_method()); if ( ctx == NULL ) { return -1; } ssl = SSL_new(ctx); if ( ssl == NULL ){ return -1; } ret = SSL_set_fd(ssl, fd); if ( ret == 0 ){ return -1; } /* PRNG */ RAND_poll(); while ( RAND_status() == 0 ) { unsigned short rand_ret = rand() % 65536; RAND_seed(&rand_ret, sizeof(rand_ret)); } /* SSL Connect */ ret = SSL_connect(ssl); if( ret != 1 ){ return -1; } //https socket write. SSL_write(ssl, buf, strlen(buf)); while((n = SSL_read(ssl, buf, BUF_LEN-1)) > 0) { buf[n] = '\0'; if(reslength == 0) { reslength += n; ressize = BUF_LEN; *res = malloc(ressize); memset(*res, 0, ressize); char *tmp; if((tmp = strstr(buf, "\r\n\r\n")) != NULL) { strcat(*res, tmp + 4); } else strcat(*res, buf); } else { reslength += n; ressize += BUF_LEN; *res = realloc(*res, ressize); strcat(*res, buf); } } if(n != 0) { return -1; } //close ssl tunnel. ret = SSL_shutdown(ssl); //if( ret != 1 ){ // usleep(10000); // ret = SSL_shutdown(ssl); // if(ret != 1) // { // close(fd); // return -1; // } //} //close the plain socket handler. close(fd); //clear ssl resource. SSL_free(ssl); SSL_CTX_free(ctx); ERR_free_strings(); } return 0; }