我正在嘗試編寫一個基本的文件服務器,它從客戶端獲取一個文件名,並通過TCP向客戶端發送數據作出響應。我的大部分工作的客戶端和服務器應用程序,但我觀察了一些奇怪的行爲,請考慮以下C套接字:write()後跟close()導致數據傳輸不完整
while ((num_read = read (file_fd, file_buffer, sizeof (file_buffer))) > 0)
{
if (num_read != write (conn_fd, article_buffer, num_read))
{
perror ("write");
goto out;
}
}
out:
close(file_fd); close(sub_fd);
file_fd
的文件描述符的文件正在通過網絡發送,conn_fd
是一個文件描述符到connect()
編輯TCP
插座。
這似乎適用於小文件,但是當我的文件變大(兆字節+)時,似乎文件末尾的一些不一致的數據量將無法傳輸。
我懷疑在寫入之後立即關閉()語句可能與它有關,所以我在close()
語句和我的客戶端成功接收了所有數據之前,嘗試了1秒sleep()
。
有沒有更好的方法來處理這個問題,而不是在服務器端做一個sleep()
?
您是在這裏演示了客戶端代碼還是服務器代碼? – abiessu 2014-10-09 03:57:59
'fsync(2)'怎麼樣? – findall 2014-10-09 04:00:41
我嘗試了fsync(),但沒有解決問題。 – user2278457 2014-10-09 04:01:11