飛鴿傳書實現原理

投木報瓊zh發表於2014-05-06
區域網聊天軟體飛鴿傳書是目前比較流行的區域網即時通訊軟體,由於歷史悠久,它具有比較多的使用者。     因為 FreeEIM 的實現原理和飛鴿傳書差不多,希望廣大使用者瞭解其原理後,在使用時更加得心應手。     程式啟動時先讀取使用者配置檔案,一般是"*.ini"格式,然後,使用Winsock的廣播訊息給整個區域網傳送一個資料包,這時候,如果其他電腦已經執行了飛鴿傳書,那麼他收到這個包後,會將包的資訊讀取出來,當然,這個包裡有使用者的IP,使用者名稱,性別等等。這樣,在使用者列表裡就多了一個使用者了。他的使用者檢查方式就如此簡單而已。至於跨網段的實現,只需簡單地修改一下廣播地址就行了,如果不考慮速度,你可以給整個internet發廣播訊息。     訊息傳送,檔案傳輸這些功能,都比較簡單,如果你會網路程式設計,給你對方IP地址,這些功能實現起來再簡單不過了。語音、視屏等,只需編寫一些語音視訊採集程式碼,傳書的話,就像傳檔案一樣。這裡給段廣播訊息的實現程式碼吧:// 傳送廣播登陸訊息
void EM_UserLogin::SendLogin_BC(LPEM_DATA msg)
{
SOCKET m_socket;
m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (INVALID_SOCKET == m_socket)
{
    MessageBox(0, "socket failed.", NULL, MB_OK);
}
SOCKADDR_IN sin;sin.sin_addr.s_addr = htonl(INADDR_BROADCAST);
sin.sin_family = AF_INET;
sin.sin_port = htons(BROADCAST_SEND_PORT);BOOL bOpt = TRUE;
if (SOCKET_ERROR == setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)))
{
    // Error occurred
    ::MessageBox(0,"BC setsockopt error.",0,0);
    return;
}
char *tmpBuf = msg->GetBuffer();
if (SOCKET_ERROR == sendto(m_socket, tmpBuf, msg->GetLength(), 0, (PSOCKADDR)&sin, sizeof(sin)))
{
    // Error occurred
    ::MessageBox(0,"BC sendto error.",0,0);
    return;
}closesocket(m_socket);
}

我們要向QQ、MSN、ICQ、AIM等大型即時通訊看齊,和他們對比,XEIM只是班級裡面的一個差生,要趕得上這些優秀的同學,只有付出更大的努力才有可能追上甚至超趕他們。但是,你什麼也不做,這會變成一個笑話。

飛鴿傳書的實現原理:

(1)最關鍵的是區域網使用者列表的建立;飛鴿啟動時使用UDP協議向255.255.255.255這個廣播地址傳送廣播包,預設埠是2425。廣播包內容包含使用者名稱、工作組、主機名、IP等資訊;
已啟動飛鴿的使用者通過2425埠收到此廣播包後,就會在自己的使用者列表中新增這個使用者的使用者名稱、工作組等資訊,同時向對方IP傳送本機使用者的個人資訊;從而雙方都能建立起使用者列表;

(2)重新整理使用者列表時傳送的廣播包和啟動時差不多,只不過返回的標識資訊略有不同;可以做一個小工具,監控2425埠記憶體流,就能截獲重新整理和聊天時的訊息。

(3)傳送聊天資訊時同樣使用UDP協議;由於UDP協議是無連線協議,傳輸速度快,但是沒有確認機制,是不可靠的協議,需要自己定義返回資訊的標誌來判斷對方是否收到資訊;

(4)使用者離線時傳送一個離線廣播包到255.255.255.255,收到此廣播包的使用者,根據包中的IP地址(也可能是多種判斷標誌或者包含硬體標識,比如網路卡地址等)刪除對方的使用者列表資訊;

(5)廣域網無法直接使用廣播方式,靠手工新增"區域網外廣播列表"來建立相互的關係;

(6)飛鴿傳送檔案是使用TCP協議,埠2425;

其他一些資料:

1.飛鴿使用C++語言,開發工具:Visual C++ 4.1, 6.0, or later;

2.飛鴿公開原始碼,在作者(來自日本廣島的白水啟章)和漢化者(阿志)網站下載原始碼,原始碼註釋為日文;可以使用VC++修改、編譯;

3.飛鴿傳書是來自日本的軟體,日文版是它的第一版本;此外還有中文,英文,韓文,葡萄牙文等語言;

4.飛鴿使用的加密演算法:RSA、Blowfish、RC;

5.飛鴿可以使用命令列方式傳送資訊,命令格式如下:

    ipmsg [埠] /MSG [/LOG][/SEAL] <主機名或IP地址> <訊息>

    可以使用IPMsg [埠] 命令改變預設埠,並同時啟動多個例項,但是修改後只有使用相同埠的使用者才能收到相互的資訊;

6.飛鴿非安裝版,並不是純綠色軟體,直接刪除會在登錄檔留下垃圾鍵值;

    * 飛鴿把所有設定資訊都儲存在登錄檔的以下位置:

    使用者密碼以不可逆加密方式儲存.

    * 如果你忘記了密碼, 可以在登錄檔中將此鍵值刪除,清除密碼*\\HKEY_CURRENT_USER\Software\HSTools\IPMsgEng\PasswordStr

7.飛鴿一次傳送檔案數達到幾千個時,有丟失檔案的可能,懷疑是飛鴿的一個bug,而傳輸大檔案則沒有問題;

8.飛鴿最穩定的正式版本是V2.06;目前v2.50 alpha6 版正在測試,尚未正式釋出;其他如2.71,2007綠色版為修改版本,並非正版;

相關文章