通过如下的函数读取浏览器的请求,但是总是不对.缺少后面的一部分内容。
没有看出问题所在。#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;
}日志如下:
[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..zzzzzzz zzzzzzzzzzzzz zzzzzzzzzz
zzzzzz zzzzzzzzzzzz zzzzzzz zzzzzzzz zzzzz
zzzzzzz zzzzz zzzzzzz zzzzzzzzz zzzzzzzz zzzzzzzz zzzzzzz zzzzzzzz
zzzzzzz zzzzzz zzzzzzzz zzzzzzzz zzzzzzz zzzzzz zzzzz
zzzzzz zzzzzzzzzzzz zzzzz zzzzzz zzzzz zzzzz zzzzz zzzzzz zzzz zzzzzz zzzz zzz zzz zzz05/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
对于日志,可以看到,读取的时候应该没有什么错误,就是在*whole_buffer = (char *)malloc(whole_buffer_len + 1); 好像总是没有申请到足够的空间似的。还有,
[05/19/08 09:13:10]  diff:20..whole_buffer_len:249[05/19/08 09:13:10]  DATA:Host: www.5d5e.comA 总是有一个"A",不知是为什么?

解决方案 »

  1.   

    *whole_buffer = (char *)malloc(whole_buffer_len + 1); 没有判断*whole_buffer是否为NULL
      

  2.   

    加入了,
    if (!*whole_buffer) {
    log_message(LOG_DEBUG,"Can't malloc whole_buffer");
    }
    没有错的。
      

  3.   

    结构太乱那就应该malloc成功了
      

  4.   

    一个字:乱这么简单的事情,非用自己写的链表实现,这不是自找麻烦吗?
    最后还要拼接整个报文,频繁申请释放小内存块,效率极低如果需要用链表,用STL里面的链表,比你自己实现的要好得多另外A的问题可能是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); // 上一句接收了diff字节的数据并没有\0结束符,你直接当字符串输出了;
                                                            // 你检查以下log_message的内部实现吧,结果不可预期
      

  5.   

    一行一行的接收是根据程序的需要,
    中间还有分析的部分没有加入呢。A的问题应该是如vocanicy所说,谢谢。
      

  6.   

    CLEANUP: 
    *whole_buffer = (char *)malloc(whole_buffer_len + 1); 这里whole_buffer_len 为400多。但是
    memcpy(*whole_buffer + whole_buffer_len, line_ptr->data,        line_ptr->len); 
    这里只能放300多,不知是为什么?
      

  7.   

    first_line = (struct read_lines_s *)calloc(sizeof(struct read_lines_s), 1); 这个对吗?应该是 first_line = (struct read_lines_s *)calloc(1, sizeof(struct read_lines_s)); 吧?不过这样的情况应该是内存初始化的时候破坏了内存的结构
    到时malloc的时候找不到内存分配的起始地址。