本帖最后由 VisualEleven 于 2011-01-12 11:32:17 编辑

解决方案 »

  1.   

    char *ami_sock_receive_internal(int sock, int wait_for_an_action_reply){
      char *resp = NULL;
      char *reall = NULL;
      char c;
      int buffLen = 0;
      int i = 0;
      int bytes;
      int total = 0;
      if(sock <= 0){ return NULL; }
      resp = (char *)malloc(sizeof(char) * AMI_MAX_BUFFER);
      buffLen = AMI_MAX_BUFFER;
      if(!resp){ return NULL; }
      resp[0] = '\0';
      while(1){
        switch (ami_sock_readable(sock,250)) {
          case -1:
            free(resp);
            return NULL;
          case 0:
            continue;      default:
            break;
        }
        bytes = recv(sock,&c,1,0);
        if(bytes <= 0 && total <= 0){
          free(resp);
          return NULL;
        }else if(bytes <= 0){
          break;
        }else{
          total += bytes;
        }
        if(i >= (buffLen - 1)){
          reall = (char *)realloc((void *)resp,(buffLen + AMI_MAX_BUFFER));
          if(!reall){
            free(resp);
            return NULL;
          }
          resp = reall;
          reall = NULL;
          buffLen += AMI_MAX_BUFFER;
        }
        resp[i] = c;
        resp[i+1] = '\0';
        if(c == '\n' && i >= 3){
          if(resp[i-3] == '\r' && resp[i-2] == '\n' && resp[i-1] == '\r' && resp[i] == '\n'){
            resp[i-1] = '\0';
            /* Is this packet an Event packet which isn't part of an action ? */
            if (!strncmp(resp, "Event:", 6)) {
              if (!strstr(resp, "ActionID: ami_")) {
                if (event_cb_func) {
                  ast_packet *packet = ami_parse_packet(resp);
                  if (!packet) {
    #ifdef _AMI_DEBUG
                    printf("Unable to parse event: %s\n", resp);
    #endif
                  } else {
                    event_cb_func(packet, event_cb_data);
                    ami_destroy_packet(packet);
                  }
                }
                free(resp);
                if (!wait_for_an_action_reply) {
                  return NULL;
                }            i = 0;
                resp = (char *)malloc(sizeof(char) * AMI_MAX_BUFFER);
                buffLen = AMI_MAX_BUFFER;
                if(!resp){ return NULL; }
                resp[0] = '\0';
                continue;
              }
            }
            break;
          }
        } else if (i == 1) {
          if (resp[i-1] == '\r' && resp[i] == '\n') {
            resp[0] = '\0';
            break;
          }
        }
        i++;
      }
      if(!strlen(resp)){
        free(resp);
        return NULL;
      }
      return resp;
    }
      

  2.   

    没什么好处,只是省去了接受缓充区.用CPU换取了一点点空间.