2013-11-01 27 views
0

我想在C中實現一個Web服務器。我正在循環中使用send命令發送請求的響應。使用發送函數在循環中發送響應

buf_len = 1;  
          while (buf_len > 0)  
          { 
            buf_len = read(fh, out_buf, BUF_SIZE); 
            if (buf_len > 0)   
            { 
              send(client_s, out_buf, buf_len, 0);     
               
            } 
          } 

我應該用'\0'終止由char out_buf[BUF_SIZE]的最後一個字符。 另外,當我試圖用相同的代碼發送一個PNG文件,有時我收到整個圖像,有時只有一半。當我刷新頁面時它會完全加載。

+0

不需要以零結束。 –

+0

@CharlieBurns你能否回答第二部分。爲什麼我有時會得到部分圖像,只有刷新頁面一次或兩次纔會顯示完整圖像。 – rdp

回答

0

對於發送功能,請參閱手冊頁

返回值 成功時,這些調用返回發送的字符數。出錯時,返回-1,並且適當地設置errno。

因此它不保證發送buf_len字節,你可以檢查返回值。

0

正如上面所說的Hardy,send並不保證buf_len字節被髮送出去。所以很多方法之一是

 buf_len = 1; 
     while (buf_len > 0) { 
     buf_len = read(fh, out_buf, BUF_SIZE); 
     if(buf_len < 0) { 
      perror("read"); 
      exit(1); 
     } 
     int sent = 0; 
     int count = buf_len; 
     while(count) { 
      int n = send(client_s, out_buf + sent, count, 0); 
      count -= n; 
      sent += n; 
     } 
     } 

out_buf是如何定義的?

+0

out_buf是char數組。我嘗試了你上面提到的方式。仍面臨同樣的問題。 – rdp

+0

它究竟是如何定義的?另外,不要忽略編譯器警告。有這些嗎? –

+0

根據定義out_buf的方式,你可以將發送行改爲「int n = send(client_s,&out_buf [sent],count,0);」 –