【正文】
rintf(time out!\n)。 } 命令設(shè)計(jì):設(shè)置 deadline ctrlcode[9]=1。 } 命令設(shè)計(jì):設(shè)置 ttl ctrlcode[8]=1。 //得到當(dāng)前用戶權(quán)限標(biāo)識(shí) if(userpw_gid!=0) // 如 果 當(dāng) 前 用 戶 不 是 root 權(quán)限 , 第 一 次 發(fā) 包 數(shù)不 能大于 3 { if(ctrlpreload3) 13 { err_proc(user must be root can set =3!\n)。 //icmp頭后邊的數(shù)據(jù)長(zhǎng)度 } else{ err_proc(packet size must be = 8!)。\039。 temppattern[patternlen1]=39。 patternlen=strlen(optarg)。 如果 sendintercal 等于 ctrlinterval 即間隔的話,就發(fā)送包并置 0,否則就加 1. 實(shí)現(xiàn)控制時(shí)間間隔的目的。更新數(shù)據(jù)庫 8 客戶端 界面設(shè)計(jì)框圖 1) 初始登錄,連接界面 2)每個(gè)用戶屬性信息,好友信息界面 3)好友之間聊天 9 客戶端與服務(wù)器信息交互邏輯框圖 客戶端與客戶端之間信息的發(fā)送 客戶端的登錄,注冊(cè), 信息更新 四、程序核心功能的實(shí)現(xiàn)機(jī)制 實(shí)驗(yàn)一 根據(jù)各個(gè)報(bào)文的報(bào)文格式,逐個(gè)分析各報(bào)文的含義及內(nèi)容 10 以太網(wǎng)幀格式 IPv4包頭格式 IPv6包頭格式 TCP包頭格式 11 UDP報(bào)文格式 2.實(shí)驗(yàn)二: : while((ch=getopt(argc,argv,i:c:p:s:l:abt:w:qI:S:h))!=1){ Switch(ch){ Case’i’:.............,break Case’c’:.............break Case ‘p’:.......... break .......... } 用 getopt 函數(shù)來讀取命令行中的命令,用 switchcase 語句來分別完成每個(gè)字母命令所對(duì)應(yīng)的設(shè)置。 ,一個(gè)服務(wù)器可以連接多個(gè)客戶端。 5 Ping程序函數(shù)概貌 m a i nr e a d l o o pr e c v f r o mp r o cs i g _ a l a r ms e n d為 S I G A L A R M 建 立信 號(hào) 處 理 程 序無 限 接 收 循 環(huán) 每 秒 發(fā) 送 一 個(gè) E c h o 消 息 1) main 函數(shù) 設(shè) 置 隨 同 E c h o 請(qǐng) 求 一 起發(fā) 送 的 可 選 數(shù) 據(jù) 長(zhǎng) 度處 理 命 令 行 參 數(shù)調(diào) 用 r e a d l o o p 處 理 分 組為 S I G A L A R M 信 號(hào)建 立 一 個(gè) 處 理 程 序處 理 主 機(jī) 名 參 數(shù) 2) readloop函數(shù) 6 創(chuàng) 建 套 接 口設(shè) 置 套 接 口緩 沖 區(qū) 大 小發(fā) 送 第 一 個(gè) 分 組讀 取 返 回 給 I C M P 原 始套 接 口 的 每 個(gè) 分 組記 錄 收 到 分 組 的 時(shí) 間調(diào) 用 p r o c 來 處 理這 些 分 組 3) proc 函數(shù) 獲 取 I C M P 頭 部 指 針檢 查 I C M P E c h o r e p l a y輸 出 收 到 的 所 有 I C M P 消 息 4) send 函數(shù) 7 構(gòu) 造 I C M P 消 息計(jì) 算 校 驗(yàn) 和發(fā) 送 數(shù) 據(jù) 報(bào) 實(shí)驗(yàn)三 : 本實(shí)驗(yàn)要實(shí)現(xiàn)的是一個(gè)客戶端服務(wù)器聊天程序 ,與我們所熟悉的 ,微信, Line 聊天程序類似,可以參照它們?cè)诨镜墓δ芸蚣苌蟻韺?shí)現(xiàn)功能的擴(kuò)展。 二 :實(shí)驗(yàn)環(huán)境 4 ? window 7 系統(tǒng)的計(jì)算機(jī) ? Linux 虛擬機(jī) ? 路由器,調(diào)試解調(diào)器 ? Wireshark 抓包軟件 ? Eclipse java 開發(fā)環(huán)境 三 :程序的需求分析與邏輯框圖 實(shí)驗(yàn)一 : 通過 Wireshark軟件,捕獲局域網(wǎng)中的數(shù)據(jù)包。 : 網(wǎng)絡(luò)層實(shí)驗(yàn) — Ping 程序的設(shè)計(jì)與實(shí)現(xiàn) 實(shí)驗(yàn)內(nèi)容: 本實(shí)驗(yàn)為 ICMP 實(shí)驗(yàn)。 實(shí)驗(yàn)要求: ? Wireshark 軟件的安裝; ? Wireshark軟件的啟動(dòng),并設(shè)置網(wǎng)卡的狀態(tài)為混雜狀態(tài),使得 Wireshark 可以監(jiān)控局域網(wǎng)的狀態(tài); ? 啟動(dòng)數(shù)據(jù)包的捕獲,跟蹤 PC 之間的報(bào)文,并存入文件以備重新查; ? 設(shè)置過濾器過濾網(wǎng)絡(luò)報(bào)文以檢測(cè)特定數(shù)據(jù)流; ? 對(duì)常用協(xié)議的數(shù)據(jù)包的報(bào)文格式進(jìn)行分析,利用協(xié)議分析軟件的統(tǒng)計(jì)工具顯示網(wǎng)絡(luò)報(bào)文的各種統(tǒng)計(jì)信息 。不顯示每個(gè)收到的包的分析結(jié)果,只在結(jié)束時(shí),顯示匯總結(jié)果 : 應(yīng)用層實(shí)驗(yàn) — 簡(jiǎn)單聊天程序的設(shè)計(jì)與實(shí)現(xiàn) 實(shí)驗(yàn)內(nèi)容: 本實(shí) 驗(yàn)要求設(shè)計(jì)并實(shí)現(xiàn)一個(gè)簡(jiǎn)單的聊天程序,包括服務(wù)器實(shí)現(xiàn)和客戶端實(shí)現(xiàn) . 實(shí)驗(yàn)要求: ? 使用 MSN 或者 ,分析聊天程序的功能需求; ? 在給定的參考程序的基礎(chǔ)上,參考 MSN 或者 ,對(duì)功能做出擴(kuò)充,不局限于以下的范圍: ? 在客戶端界面上顯示所有聯(lián)入聊天服務(wù)器的用戶; ? 支持兩個(gè)用戶之間的聊天; ? 支持增加好友的功能,好友上線時(shí)如果該用戶在線,則做出提醒; ? 增加用戶的個(gè)人信息修改、保存和查詢; ? 在聊天內(nèi)容中支持中文; ? 在聊天內(nèi)容中支持圖片等多媒體信息; ? 支持在用戶之間傳輸文件等附件; 其他擴(kuò)展。另一部分由 SIGALARM信號(hào)每秒驅(qū)動(dòng)一次。 ,我們應(yīng)該設(shè)計(jì)用戶連接,登錄,聊天界面,更加實(shí)用,便于理解。接收發(fā)送端客戶的信息,將信息發(fā)給確定的接受者。 } sendinterval++。 } 如果發(fā)包數(shù)達(dá)到了設(shè)置的發(fā)包數(shù),就會(huì)終止發(fā)包,達(dá)到控制發(fā)包數(shù)的目的 命令設(shè)計(jì):設(shè)置 pattern ctrlcode[3]=1。//復(fù)制 optarg內(nèi)容到 temp if(patternlen%2!=0) { temppattern[patternlen]=temppattern[patternlen1]。 temppattern[patternlen]=39。 if(ctrlpacketsize=8) { datalen=ctrlpacketsize。 //設(shè)置第一次發(fā)包數(shù)量 user=getpwuid(getuid())。size, sizeof(size))。ctrlttl, sizeof(ctrlttl))。 } waitinterval++。 命令設(shè)計(jì):設(shè)置安靜模式 ctrlcode[10] 在 ipv4和 ipv6處理函數(shù)中 void proc_v4(char *ptr, ssize_t len, struct timeval *tvrecv) //ipv4處理函數(shù) { .......... if(ctrlcode[10]!=1)//不是安靜模式則輸出信息,否則不輸出 {printf(%d bytes from %s: seq=%u, ttl=%d, rtt=%.3f ms\n, icmplen, sock_ntop_host(prsarecv, prsalen), icmpicmp_seq, ipip_ttl, rtt)。 =htons(sizeof(iph)+icmphlen)。 //8 位生存時(shí)間 TTL =IPPROTO_ICMP。 //32位目的 IP 地址 } 命令設(shè)計(jì):設(shè)置 sndbuf ctrlcode[12]=1。 } 在 mainloop 函數(shù)中實(shí)現(xiàn) sndbufsize=ctrlsndbuf*84*1024。 printf( [p pattern] [s packetsize] [t ttl] [l preload]\n)。 printf(b Allow pinging a broadcast address.\n\n)。 printf(c count\n)。 printf(w deadline\n)。 printf( Specify up to 16 hex bytes to fill out the packet you send.\n\n)。 printf( Set the IP Time to Live.\n\n)。 printf( more than3.\n\n)。 printf( Set socket sndbuf. If not specified, it is selected to \n)。 addActionListener()按鈕事件監(jiān)聽 17 用戶信息,好友信息顯示界面 根據(jù)初始的界面設(shè)計(jì),進(jìn)行布局設(shè)置,利用 BorderLayout, JPanel, JScrollPane, JTextField, JButton 等控件擺出用戶界面的布局,并在按鈕,輸入框中添加事件監(jiān)聽,鍵盤監(jiān)聽以及焦點(diǎn)事件監(jiān)聽 addActionListener(), addKeyListener(), addFocusListener()。來顯示所有在線的用戶以及好友用戶信息。 1. connect()。 getMsgFrom_ Dialog()如果是文字信息 [msg]直接發(fā)送給服務(wù)器 ,如果是 [FILE]文件,利用 socket2 將信息文件名發(fā)送服務(wù)器; getMsgFrom_connect()獲取服務(wù)器地址,端口號(hào),用戶名以及密碼;如果是 [CON]注冊(cè)信息,向服務(wù)器發(fā)送 [CON]+L +用戶名 +密碼,如果是 [REG]登錄信息,向服務(wù)器發(fā)送 [CON]+R +用戶名 +密碼, ClientMsgSender extends Thread {} ClientMsgListener extends Thread{} 19 ClientMsgSender extends Thread {} 客戶端發(fā)送信息 到服務(wù)器 具體流程圖如下圖所示 客戶端信息發(fā)送流程圖 3. ClientMsgListener extends Thread 接收來自服務(wù)器的信息 20 開 始用 B u f f e r R e a d e r I n p u t S t r e a m R e a d e r( S . g e t I n p u t S t r e a m ( ) ) 實(shí) 例 化 數(shù) 據(jù)流R u n n i n g ?R e a d e r . C l o s e ( )N結(jié) 束M s g = r e a d e r . r e a d l i n e不 為 空Y信 息 頭 部 關(guān) 鍵字 為 [ M S G ]Y提 取 s e n d e r , l i s t e n e r , 內(nèi)容 調(diào) 用 s t o r e M s g 發(fā) 送 到 顯示 對(duì) 話 框Y N信 息 頭 部 關(guān) 鍵字 為 [ F I L E ]提 取 s e n d e r , l i s t e n e r , 內(nèi) 容 調(diào)用 S t o r e M s g 發(fā) 送 到 顯 示 框 , 調(diào)用 g e t f i l e 接 受 , 緩 存 文 件Y信 息 頭 部 關(guān) 鍵字 為 [ S U C C E S S ]N設(shè) 置 連 接 狀 態(tài) 為 t r u e ,修 改 數(shù) 據(jù) 庫 登 陸 成 功Y信 息 頭 部 關(guān) 鍵字 為 [ F U S E R ]N顯 示 好 友 上 的 信 息Y信 息 頭 部 關(guān) 鍵字 為 [ N O U