2010-10-20 一語點醒夢中人
前幾天在調試基於UDP協議傳輸數據的代碼,卡了兩天,死活不通。原意是使用UDP協議讀取到特定的字節後改變緩衝區大小,再使用它去讀取後邊的數據,但是再讀取數據時,讀到的數據是這個特定的字節加後邊的信息,不知道爲什麼會重複讀取到這個特定的字節。後來一個同事問另一個同事,他說:使用UDP協議傳輸數據,每次的數據都是新的,這次傳輸的數據沒讀完,UDP包就被丟棄了,下次讀取的數據就是另外一個新的UDP包了。後來在代碼中加上打印信息,兩次讀的數據果然不同。真是一語點醒夢中人,在此記下,以免以後碰到類似問題又忘了!
2010-10-26 字節對齊
對於前者,括號裏爲“(packed)”的時候,如果是普通數據類型,那麼表示按照1個字節對齊,如果是位域時,表示按位對齊;如果括號中是“(aligned(n))”,表示按照n個字節對齊(n必須是2的冪),但是經測試n的值小於結構體或者聯合體中最長的變量的長度時,對齊採用默認對齊方式;當編譯器對變量的最大對齊值設置爲一個特定值時,如果n大於這個值,那麼只按照編譯器設置的最大值對齊。如果括號中是“(aligned)”,採用默認的對齊方式。另外,__attribute__(xxx)可以用於結構體或聯合體中的成員。
對於後者,括號裏爲空時,表示採用默認最大最有益的對齊方式。n也必須是2的冪。當n小於結構體或者聯合體中最長的變量的長度時,對齊採用n字節對齊方式;當n大於等於結構體或者聯合體中最長的變量的長度時,採用默認對齊方式。#pragma pack(x)不能單獨用於結構體和聯合體中的成員。
默認對齊方式是採用當前最長的變量的長度作爲對齊方式。
2011-10-20
setsockopt函數在Windows和Linux下設置參數的區別
Linux:
struct timeval tv = {3, 0};//3s
int ret = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
int ret = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
//ret == 0 OK, ret == -1 fail
int recvd = recv(sock_fd, buf, 1024, 0);
if (recvd == -1 && errno == EAGAIN)
{
printf("timeout\n");
}
Windows:
int timeout = 3000; //3s
int ret = setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
int ret = setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));