工作中的一些小總結

2010-10-20 一語點醒夢中人

    前幾天在調試基於UDP協議傳輸數據的代碼,卡了兩天,死活不通。原意是使用UDP協議讀取到特定的字節後改變緩衝區大小,再使用它去讀取後邊的數據,但是再讀取數據時,讀到的數據是這個特定的字節加後邊的信息,不知道爲什麼會重複讀取到這個特定的字節。後來一個同事問另一個同事,他說:使用UDP協議傳輸數據,每次的數據都是新的,這次傳輸的數據沒讀完,UDP包就被丟棄了,下次讀取的數據就是另外一個新的UDP包了。後來在代碼中加上打印信息,兩次讀的數據果然不同。真是一語點醒夢中人,在此記下,以免以後碰到類似問題又忘了!

2010-10-26 字節對齊

    下午看程序源碼的時候看見這麼個東西:“struct xxx{...;}__attribute__((packed));”,Google了一下知道是字節對齊的擴展標誌。類似的還有個“#pragma pack(n)”,VC++6.0只支持後者,GCC二者都支持。想起來以前到公司筆試的時候遇到過“#pragma pack(n)”,當時不知道什麼意思,在幾個題後邊全寫一樣的結果...二者都可以用於調整結構體或者聯合體中的字節對齊。
    對於前者,括號裏爲“(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));

發佈了22 篇原創文章 · 獲贊 20 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章