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);
爲什麼這個問題會發生,我怎麼能解決呢?
ftell文檔指出,返回值僅對fseek有意義,以便在使用文本模式(與二進制模式)時恢復位置。嘗試以二進制模式「rb」打開文件。 (http://www.cplusplus.com/reference/cstdio/ftell/) –
您不顯示如何打開'fd'。它是否處於非阻塞模式?你似乎沒有檢查'write()'到'fd'的返回值,所以你怎麼知道所有的東西都被寫入了? – abligh
@abligh我知道一切都在寫,因爲當我在本地主機上測試完全相同的東西時,它的工作原理是,所有的圖像都被加載。 – tversteeg