通过如下的函数读取浏览器的请求,但是总是读不全.缺少后面的一部分内容。没有看出问题所在。#define SEGMENT_LEN (512)
int readline(int fd,char **whole_buffer)
{ int whole_buffer_len;
char buffer[SEGMENT_LEN];
char *ptr; int ret;
int diff;
struct read_lines_s{
char *data;
size_t len;
struct read_lines_s *next;
};
struct read_lines_s *first_line, *line_ptr; first_line = (struct read_lines_s *)calloc(sizeof(struct read_lines_s), 1);
if (!first_line)
return 0; line_ptr = first_line;
whole_buffer_len = 0;
for (;;) {
ret = recv(fd, buffer, SEGMENT_LEN, MSG_PEEK);
if (ret <= 0)
goto CLEANUP;
ptr = (char *)memchr(buffer, '\n', ret);
if (ptr)
diff = ptr - buffer + 1;
else
diff = ret;
whole_buffer_len += diff;

line_ptr->data = (char *)malloc(diff);
if (!line_ptr->data) {
goto CLEANUP;
}
recv(fd, line_ptr->data, diff, 0);
line_ptr->len = diff;
if (diff == 2 && ret == 2)
{
line_ptr->next = 0;
}else
{
line_ptr->next = (struct read_lines_s *)calloc(sizeof(struct read_lines_s), 1);
}
if (!line_ptr->next) {
goto CLEANUP;
}
line_ptr = line_ptr->next;
}
CLEANUP:
*whole_buffer = (char *)malloc(whole_buffer_len);
whole_buffer_len = 0;
line_ptr = first_line;
while (line_ptr) {
memcpy(*whole_buffer + whole_buffer_len, line_ptr->data,
       line_ptr->len);
free(line_ptr->data);
whole_buffer_len += line_ptr->len;
log_message(LOG_DEBUG,"data_While:%s",*whole_buffer);
line_ptr = line_ptr->next;
}
ret = whole_buffer_len;
log_message(LOG_DEBUG,"data:%s",*whole_buffer);
return ret;
}

解决方案 »

  1.   

    #define SEGMENT_LEN (512)
    #define MAXIMUM_BUFFER_LENGTH (128 * 1024)
    int readline(int fd,char **whole_buffer)
    { int whole_buffer_len;
    char buffer[SEGMENT_LEN];
    char *ptr; int ret;
    int diff;
    struct read_lines_s{
    char *data;
    size_t len;
    struct read_lines_s *next;
    };
    struct read_lines_s *first_line, *line_ptr; first_line = (struct read_lines_s *)calloc(sizeof(struct read_lines_s), 1);
    if (!first_line)
    return 0; line_ptr = first_line;
    whole_buffer_len = 0;
    for (;;) {
    ret = recv(fd, buffer, SEGMENT_LEN, MSG_PEEK);
    if (ret <= 0)
    goto CLEANUP;
    ptr = (char *)memchr(buffer, '\n', ret);
    if (ptr)
    diff = ptr - buffer + 1;
    else
    diff = ret;
    whole_buffer_len += diff;
    log_message(LOG_DEBUG,"diff:%d..whole_buffer_len:%d",diff,whole_buffer_len);

    line_ptr->data = (char *)malloc(diff);
    if (!line_ptr->data) {
    goto CLEANUP;
    }
    recv(fd, line_ptr->data, diff, 0);
    log_message(LOG_DEBUG,"DATA:%s",line_ptr->data);
    line_ptr->len = diff;
    if (diff == 2 && ret == 2)
    {
    line_ptr->next = 0;
    }else
    {
    line_ptr->next = (struct read_lines_s *)calloc(sizeof(struct read_lines_s), 1);
    }
    if (!line_ptr->next) {
    goto CLEANUP;
    }
    line_ptr = line_ptr->next; }
    CLEANUP:
    *whole_buffer = (char *)malloc(whole_buffer_len + 1);
    int i = whole_buffer_len;
    while(i != -1){
    *(*whole_buffer + i--) = 'z';
    }
    *(*whole_buffer + whole_buffer_len) = '\0';
    log_message(LOG_DEBUG,"LEN:%d..%s",whole_buffer_len,*whole_buffer);
    whole_buffer_len = 0;
    line_ptr = first_line;
    while (line_ptr) {
    memcpy(*whole_buffer + whole_buffer_len, line_ptr->data,
           line_ptr->len);
    whole_buffer_len += line_ptr->len;
    log_message(LOG_DEBUG,"data:%s",*whole_buffer);
    line_ptr = line_ptr->next;
    }
    ret = whole_buffer_len;
    log_message(LOG_DEBUG,"data:%s",*whole_buffer); do {
    line_ptr = first_line->next;
    if (first_line->data)
    free(first_line->data);
    free(first_line);
    first_line = line_ptr;
    } while (first_line); return ret;
    }
      

  2.   

    日志如下:
    [05/19/08 09:13:10]  Create Thread succeed(1924)[05/19/08 09:13:10]  Connect (file descriptor 1924): teacher1 [192.168.36.62][05/19/08 09:13:10]  initialize_conn success![05/19/08 09:13:10]  diff:35..whole_buffer_len:35[05/19/08 09:13:10]  DATA:GET http://www.5d5e.com/ HTTP/1.0[05/19/08 09:13:10]  diff:13..whole_buffer_len:48[05/19/08 09:13:10]  DATA:Accept: */*[05/19/08 09:13:10]  diff:24..whole_buffer_len:72[05/19/08 09:13:10]  DATA:Accept-Language: zh-cn[05/19/08 09:13:10]  diff:50..whole_buffer_len:122[05/19/08 09:13:10]  DATA:If-Modified-Since: Sat, 17 May 2008 13:40:02 GMT[05/19/08 09:13:10]  diff:38..whole_buffer_len:160[05/19/08 09:13:10]  DATA:If-None-Match: "aa38e18123b8c81:ba3"[05/19/08 09:13:10]  diff:69..whole_buffer_len:229[05/19/08 09:13:10]  DATA:User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)[05/19/08 09:13:10]  diff:20..whole_buffer_len:249[05/19/08 09:13:10]  DATA:Host: www.5d5e.comA[05/19/08 09:13:10]  diff:30..whole_buffer_len:279[05/19/08 09:13:10]  DATA:Proxy-Connection: Keep-Alive[05/19/08 09:13:10]  diff:2..whole_buffer_len:281[05/19/08 09:13:10]  DATA:[05/19/08 09:13:10]  LEN:281..zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz05/19/08[05/19/08 09:13:10]  Closed connection between local client (fd:1924) and remote client (fd:-1)[05/19/08 09:13:10]  Client (1924) close message: No error