我正在閱讀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返回錯誤字節數到文件描述符...
在此先感謝。
所以,這聽起來像你說我應該做一個長度檢查,因爲我讀。 由於UDP截斷,這也是一個問題嗎? – benc 2009-09-25 05:04:31
是的,您可以檢查'read'的返回值以確保它不會比您預期的要短。 UDP數據包不應該被截斷 - 它們將被完整傳送或者根本不傳送(再次,只要你給'read'的緩衝區足夠長)。 – caf 2009-09-25 05:18:42