2014-02-10 80 views
0

我使用套接字在C中創建一個簡單的網絡服務器,它監聽端口10001;到目前爲止,它的工作原理和我可以在我的瀏覽器中加載所有圖像時,我使用http://127.0.0.1:10001/。但是當我嘗試在網站上訪問它時,所有大於4kb的圖像都不會顯示出來,而當我單獨打開它們時,它只會顯示圖像的1/3左右。使用C服務器通過互聯網發送大文件(圖像)

我有一個域名服務器將流量重定向到我的路由器端口80,然後又將其轉發到端口10001我的本地機器上。

這些文件得到發送這樣的(在這種情況下,JPEG圖像):

FILE *fp; 
char *buf, header[1024]; 
int fsize, hsize, nbytes; 
struct tm *itime; 
time_t rawtime; 

fp = fopen(file, "r"); 

fseek(fp, 0, SEEK_END); 
fsize = ftell(fp); 
rewind(fp); 

time(&rawtime); 
itime = localtime(&rawtime); 

hsize = sprintf(header, "HTTP/1.1 200 OK\r\n" 
         "Server: iserv\r\n" 
         "Date: %s" 
         "Content-Length: %d\r\n" 
         "Content-Type: image/jpeg\r\n" 
         "Accept-Ranges: bytes\r\n" 
         "Connection: keep-alive\r\n\r\n", asctime(itime), fsize); 

write(fd, header, hsize); 

buf = (char*)malloc(CHUNK_SIZE); 
while((nbytes = fread(buf, sizeof(char), CHUNK_SIZE, fp)) > 0) 
    write(fd, buf, nbytes); 

free(buf); 

爲什麼這個問題會發生,我怎麼能解決呢?

+0

ftell文檔指出,返回值僅對fseek有意義,以便在使用文本模式(與二進制模式)時恢復位置。嘗試以二進制模式「rb」打開文件。 (http://www.cplusplus.com/reference/cstdio/ftell/) –

+1

您不顯示如何打開'fd'。它是否處於非阻塞模式?你似乎沒有檢查'write()'到'fd'的返回值,所以你怎麼知道所有的東西都被寫入了? – abligh

+0

@abligh我知道一切都在寫,因爲當我在本地主機上測試完全相同的東西時,它的工作原理是,所有的圖像都被加載。 – tversteeg

回答

1

write()因爲你的插槽設置爲非阻塞沒有寫出來的整個數據,你是不是寫檢查量。最簡單的方法是用fcntl(fd, FSET_FL ...)清除O_NONBLOCK

相關問題