2017-03-16 136 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的包裝,它們會使程序成功或崩潰。我在這裏使用它們來避免使用內存分配錯誤恢復邏輯混淆示例。你將不得不決定他們是否適合你做的任何事情。