static int socket_recv(CTXTdeclc int *rc, char** buffer, UInteger *buffer_len, int timeout) { SOCKET sock_handle = (SOCKET) ptoc_int(CTXTc 2); if (read_select(sock_handle, timeout)) { *rc = readmsg(sock_handle, buffer, buffer_len); return NORMAL_TERMINATION; } else return TIMED_OUT; }
static int socket_accept(CTXTdeclc SOCKET *sock_handle, int timeout) { SOCKET sock_handle_in = (SOCKET) ptoc_int(CTXTc 2); if (read_select(sock_handle_in, timeout)) { *sock_handle = accept(sock_handle_in, NULL, NULL); return NORMAL_TERMINATION; } else { return TIMED_OUT; } }
static int socket_get0(CTXTdeclc int *rc, char* message_read, int timeout) { SOCKET sock_handle; sock_handle = (SOCKET) ptoc_int(CTXTc 2); if (read_select(sock_handle, timeout)) { do { XSB_SOCKET_ERRORCODE_RESET; *rc = recvfrom(sock_handle, message_read, 1, 0, NULL, 0); } while (*rc == -1 && XSB_SOCKET_ERRORCODE == EINTR); return NORMAL_TERMINATION; } else { return TIMED_OUT; } }
int SimpleRedisClient::redis_raw_send(char recvtype,const char *dataCommand) { int rc = send_data(dataCommand); if (rc < 0) { print_rcBacktrace("Данные не отправлены [RC_ERR_SEND]"); reconect(); return RC_ERR_SEND; } if (rc != (int) strlen(dataCommand)) { print_rcBacktrace("Ответ не получен [RC_ERR_TIMEOUT]"); reconect(); return RC_ERR_TIMEOUT; } bzero(buffer,buffer_size); rc = read_select(fd, timeout); if(debug) printf("REDIS read_select=%d\n", rc); if (rc > 0) { int offset = 0; do{ rc = recv(fd, buffer + offset, buffer_size - offset, 0); if(rc < 0) { return CR_ERR_RECV; } if(rc >= buffer_size - offset && buffer_size * 2 > max_buffer_size) { char nullbuf[1000]; int r = 0; while( (r = recv(fd, nullbuf, 1000, 0)) >= 0) { if(debug) printf("REDIS read %d byte\n", r); } last_error = RC_ERR_DATA_BUFFER_OVERFLOW; break; } else if(rc >= buffer_size - offset && buffer_size * 2 < max_buffer_size) { if(debug) printf("REDIS Удвоение размера буфера до %d\t[rc=%d, buffer_size=%d, offset=%d]\n",buffer_size *2, rc, buffer_size, offset); int last_buffer_size = buffer_size; char* tbuf = buffer; buffer_size *= 2; buffer = new char[buffer_size]; delete buf; buf = new char[buffer_size]; memcpy(buffer, tbuf, last_buffer_size); offset = last_buffer_size; } else { break; } }while(1); if(debug >= RC_LOG_DEBUG) printf("REDIS BUF: recv:%d buffer[%s]",rc, buffer); char prefix = buffer[0]; if (recvtype != RC_ANY && prefix != recvtype && prefix != RC_ERROR) { printf("\x1b[31m[fd=%d]REDIS RC_ERR_PROTOCOL[%c]:%s\x1b[0m\n",fd, recvtype, buffer); print_rcBacktrace(buffer); return RC_ERR_PROTOCOL; } char *p; int len = 0; switch (prefix) { case RC_ERROR: printf("\x1b[31mREDIS[fd=%d] RC_ERROR:%s\x1b[0m\n",fd,buffer); data = buffer; data_size = rc; print_rcBacktrace(buffer); return -rc; case RC_INLINE: if(debug) printf("\x1b[33mREDIS[fd=%d] RC_INLINE:%s\x1b[0m\n", fd,buffer); data_size = strlen(buffer+1)-2; data = buffer+1; data[data_size] = 0; return rc; case RC_INT: if(debug) printf("\x1b[33mREDIS[fd=%d] RC_INT:%s\x1b[0m\n",fd, buffer); data = buffer+1; data_size = rc; return rc; case RC_BULK: if(debug) printf("\x1b[33mREDIS[fd=%d] RC_BULK:%s\x1b[0m\n",fd, buffer); p = buffer; p++; if(*p == '-') { data = 0; data_size = -1; return rc; } while(*p != '\r') { len = (len*10)+(*p - '0'); p++; } /* Now p points at '\r', and the len is in bulk_len. */ if(debug > 3) printf("%d\n", len); data = p+2; data_size = len; data[data_size] = 0; return rc; case RC_MULTIBULK: if(debug) printf("\x1b[33mREDIS[fd=%d] RC_MULTIBULK[Len=%d]:%s\x1b[0m\n", fd, rc, buffer); data = buffer; p = buffer; p++; int delta = 0; multibulk_arg = read_int(p, &delta); if(multibulk_arg < 1) { data = 0; data_size = -1; if(debug > 5) printf("\x1b[33mREDIS RC_MULTIBULK data_size = 0\x1b[0m\n"); return rc; } data_size = multibulk_arg; answer_multibulk = new char*[multibulk_arg]; p+= delta + 3; for(int i =0; i< multibulk_arg; i++) { if( buffer_size - 10 < p - buffer) { multibulk_arg = i-1; data_size = i - 1; if(debug) printf("\x1b[33mREDIS Выход по приближению к концу буфера [p=%d|multibulk_arg=%d]\x1b[0m\n", (int)(p - buffer), multibulk_arg); last_error = RC_ERR_DATA_BUFFER_OVERFLOW; return rc; } len = 0; while(*p != '\r') { len = (len*10)+(*p - '0'); p++; } p+=2; answer_multibulk[i] = p; p+= len; if( buffer_size - 1 < p - buffer ) { multibulk_arg = i-1; data_size = i - 1; if(debug) printf("\x1b[33mREDIS Выход по приближению к концу буфера [p=%d|multibulk_arg=%d]\x1b[0m\n", (int)(p - buffer), multibulk_arg); last_error = RC_ERR_DATA_BUFFER_OVERFLOW; return rc; } *p = 0; p+= 3; } return rc; } return rc; } else if (rc == 0) { print_rcBacktrace("Соединение закрыто [RC_ERR_CONECTION_CLOSE]"); reconect(); return RC_ERR_CONECTION_CLOSE; // Соединение закрыто } else { print_rcBacktrace("Не пришли данные от redis[RC_ERR]"); return RC_ERR; // error } }
int main(void) { int i; DARR *sturoot; if ((sturoot = load_darr("db.db")) == NULL){ printf("load db error.\n"); if ((sturoot = create_darr(sizeof(struct stu))) == NULL) { printf("create date error.\n"); return -1; } } /* ** 0,q for exit; 1,f for find; 2, i for insert; 3,d for delete, 4, l for list, 5, e for erase; ** 6, a for delete duplication; 7, u for update, 8, s for sort, 9 for Save data, @ for Load data; */ while ((i = read_select()) != '0' && i != 'q' && i != 'Q') /* 主循环,获取控制输入*/ switch (i){ case '1': case 'F': case 'f': printf("Please enter the search condition: [ID],[Name],[Scope]\n"); { struct stu tmp, *ret; if (getline(&tmp) == 0) { printf("Input Format wrong!\n"); } else if ((ret =(struct stu *)find_node(sturoot,&tmp,cmp)) == NULL) printf("Record is not exist!"); else print_node(ret); } any_key(); break; case '2': case 'I': case 'i': if (sturoot == NULL) { printf("Datebase is empty, System will re-create it.\n"); if ((sturoot = create_darr(sizeof(struct stu))) == NULL) { printf("DB is empty,create date error.\n"); return -1; } } printf("Please enter the new record: 'ID,Name,Scope:'\n"); { struct stu tmp; if (getline(&tmp) == 0) printf("Input Format wrong!\n"); else if (inserd_node(sturoot,&tmp,0) == -1) printf("Input Error!"); else printf("Insert OK!"); } any_key(); break; case '3': case 'D': case 'd': printf("Please enter the condition : [ID],[Name],[Scope]\n"); { struct stu tmp; if (getline(&tmp) == 0) printf("Input Format wrong!"); else delete_node(sturoot,&tmp, &cmp); } any_key(); break; case '4': case 'L': case 'l': travel(sturoot,print_node); any_key(); break; case '5': case 'E': case 'e': erase(sturoot); printf("All data has erase!!"); sturoot = NULL; any_key(); break; #if 0 case '6': case 'A': case 'a': printf("Please enter the condition: [ID],[Name],[Scope]\n"); { struct stu tmp; if (getline(&tmp) == 0) { printf("Input Format wrong!"); } else if (delete(&sturoot, &tmp, DELETE_ALL_YES) == 0) printf("Record is not exist!"); } any_key(); break; #endif case '7': case 'U': case 'u': { struct stu tmp_from, tmp_to, *tmp_find; printf("Please enter the condition: [ID],[Name],[Scope]\n"); if (getline(&tmp_from) == 0) { printf("Input Format wrong!"); } else if ((tmp_find = (struct stu *)find_node(sturoot,&tmp_from,cmp)) != NULL) { print_node(tmp_find); printf("Please enter the new data: [ID],[Name],[Scope]\n"); if (getline(&tmp_to) == 0) printf("Input Format wrong!"); else if (update_node(tmp_find, &tmp_to) == 0) printf("Update Succeed."); } else printf("Record is not exist!"); } any_key(); break; case '8': case 'S': case 's': { int sel; int (*fun)(const void *, const void*); printf("Please select sort by:\n1[by ID]\t2[by name]\t3[by scope]:"); if ((sel=get_num()) <= 3 && sel >= 1) { switch (sel) { case 1: fun = cmp_id; break; case 2: fun = cmp_name; break; case 3: fun = cmp_scope; break; } darr_sort(sturoot,fun); printf("Sort Succeed."); } else printf("Select wrong."); } any_key(); break; case '9': if (save_darr(sturoot, "db.db") == -1) fprintf(stderr, "Open file failed.\n"); any_key(); break; default: break; } return 0; }