2017-03-16 140 views
-1

我的任务是从HTTP协议文件的服务器数据获取 但问题是我不知道内容的大小,所以我遍历阅读func从socked获取数据,但它迭代每只有一次我不知道是不是真的,为什么从周期服务器获取数据

int res, len, total, boolk = 0, p=0; 
while ((res = read(client_socket,bufferOut,4095)) > 0) 
{ 
    bufferOut[res]= '\0'; 
    if(p==0) 
    { 
     buffer = calloc(strlen(bufferOut)+1,sizeof(char)); 
     } 
     else 
     { 
      buffer = realloc(buffer,strlen(buffer)*sizeof(char)+strlen(bufferOut)+1*sizeof(char)); 
     } 
     strcat(buffer,bufferOut); 
     if(isEnough(bufferOut)!=0 && boolk == 0) 
     { 
      index = getIndex(buffer); 
      kk = getCode(buffer); 
      len = getLen(buffer); 
      boolk = 1; 
     } 
     if(strlen(bufferOut)>=len+index && boolk == 1) 
     { 
      break; 
     } 
     p++; 
    } 

功能isEnough只有这样看来,如果完整的HTTP标头抵getIndex获得头和getLen获得该文件的长度lenght时间,所以我想迭代,直到缓冲区是相同lenght的头文件,该文件应该是

回答

0

你工作太辛苦了。

int 
read_until_enough(int client_socket, char **buf_out, size_t *buflen_out) 
{ 
    char *rdbuf = xmalloc(INITIAL_BUFFER_SIZE); 
    size_t buflen = 0, bufalloc = INITIAL_BUFFER_SIZE; 

    for (;;) { 
     ssize_t n = recv(client_socket, rdbuf + buflen, bufalloc - buflen); 
     if (n <= 0) goto recv_failure; 
     if (is_enough(rdbuf, buflen)) break; 

     buflen += n; 
     if (buflen == bufalloc) { 
      bufalloc *= 2; 
      rdbuf = xrealloc(rdbuf, bufalloc); 
     } 
    } 
    *rdbuf_out = rdbuf; 
    *buflen_out = buflen; 
    return 0; 

recv_failure:; 
    int save_errno = errno; 
    free(rdbuf); 
    errno = save_errno; 
    *rdbuf_out = 0; 
    *buflen_out = 0; 
    return -1; 
} 

请注意:is_enough现在只需接收到的数据的大小作为一个参数,来电者都得到接收到的数据和它的大小和缓冲区不是空终止。 HTTP是一种二进制透明协议;你不可以rfc2119假设你永远不会收到nul字节。

请注意,is_enough是无状态的,预计会做全部的解析。这是更好的分离问题。担心在每次执行完所有工作之后,每次在循环中重新解析HTTP标头的性能成本。

最后,函数xmalloc and xrealloc是围绕mallocrealloc的包装,它们会使程序成功或崩溃。我在这里使用它们来避免使用内存分配错误恢复逻辑混淆示例。你将不得不决定他们是否适合你做的任何事情。