示例#1
0
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;
}
示例#2
0
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;
  }
}
示例#3
0
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
        }
    }
示例#5
0
文件: printmenu.c 项目: yumm007/C
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;
}