顯示具有 Unix Socket Programming 標籤的文章。 顯示所有文章
顯示具有 Unix Socket Programming 標籤的文章。 顯示所有文章

2013年8月9日 星期五

驗證子網路遮罩是否合法(NetMask Check)

驗證Netmask方式很簡單,只要判斷從netmask是否為連續1即可。

bool CheckNetMask (char* pszMask)
{   
   bool bFoundOne = false;
   unsigned long lNetMask;
    if (pszMask != NULL)
    {
        lNetMask = inet_addr(pszMask);
        if (lNetMask == INADDR_NONE)
        {
            if (strcmp(pszMask, "255.255.255.255") == 0)
                return true;
            else
                return false;
        }
        else
        {
            lNetMask = ntohl(lNetMask);
            unsigned long ulMask = 1;

            while (ulMask != 0)
            {
                if (lNetMask & ulMask)
                    bFoundOne = true;
                else if (bFoundOne)
                    return false;
                ulMask << 1;
            }
           
            return true;
        }
    }
    else
        return false;
}

2009年11月28日 星期六

SO_REUSEADDR

當一個Socket server如果重新啟動時,在bind的過程就會出現:Address already in use的錯誤訊息,必須等待TCP TIME_WAIT state的時間(2 * MSL)才能使用這個Address。為了避免這個問題發生,我們可以透過修改socket參數來讓socket可以馬上bind之前的Address。

sock = socket(AF_INET, SOCK_STREAM, 0);

int on = 1;
int status = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on));
if (status == -1)
perror("setsockopt() error");