2009-09-24 18 views
0

我正在閱讀Comer的TCP/IP第三卷互聯網。在轉換之前,「時間服務的UDP客戶端」是否需要檢查讀取數據的長度?

我正在查看UDP的「TIME」客戶端的一些示例代碼。

代碼到達了讀取響應的地步,它需要4個字節並將其轉換爲32位無符號整數,因此可以將其轉換爲UNIX時間。

「n」是指向偵聽UDP的套接字的文件描述符。

n = read (s, (char *)&now, sizeof(now)); 
if (n < 0) 
    errexit("read failed: %s\n", strerror(errno)); 
now = ntohl((u_long)now); /* put in host byte order */ 

我想知道的是:

是否存在應使轉換前要檢查一些假設?這是在C中,我想知道是否有讀取通過的字節數不是4的情況。如果是這樣,看起來像「現在」將是一團糟。

「現在」被定義爲:

time_t now; /* 32-bit integer to hold time */ 

所以也許我不明白「的time_t」的性質,或如何字節用C傳來傳去,或者什麼情況下會UDP返回錯誤字節數到文件描述符...

在此先感謝。

回答

1

使用UDP,只要您傳遞給read的接收緩衝區足夠長,單個UDP數據包就不會在read調用之間中斷。

但是,不能保證對方發送了至少4個字節的數據包 - 如果服務器只發送了2字節的響應,那麼代碼會使now包含垃圾,這是非常正確的。

在這種情況下,這可能無關緊要 - 畢竟,服務器可以自由發送4個字節的垃圾,因爲它只發送2個字節。如果你想檢查它,只需檢查由read返回的n是否與您期望的一樣長。

+0

所以,這聽起來像你說我應該做一個長度檢查,因爲我讀。 由於UDP截斷,這也是一個問題嗎? – benc 2009-09-25 05:04:31

+0

是的,您可以檢查'read'的返回值以確保它不會比您預期的要短。 UDP數據包不應該被截斷 - 它們將被完整傳送或者根本不傳送(再次,只要你給'read'的緩衝區足夠長)。 – caf 2009-09-25 05:18:42

相關問題