udp傳送過程:
1.應用層:繫結udp套接字
我們必須先建立乙個udp套接字,通過呼叫udp_new()進行申請,然後呼叫udp_bind()繫結在udp埠上,在這個呼叫過程中,我們必須編寫乙個用於處理這個udp套接字接收到的資料報文的函式,並把這個函式作為udp_bind()的引數,以後當套接字接收到資料報文時會自動呼叫這個函式,我們將在後面介紹這個函式怎麼呼叫的。繫結結束之後,必須呼叫udp_connect()將資料報文的目的位址繫結在udp的資料結構中,最後就是呼叫udp_send()把資料報文傳送出去。
2.傳輸層的處理
做好應用層的處理之後,資料報文被提交到udp層,udp_send()函式中首先給資料報文加入udp頭部,然後呼叫ip_route()選擇乙個合適的網路介面進行傳送,最後呼叫ip_output()把資料報文傳入ip層。
3.ip層的處理
ip_route()函式比較各個網路介面的ip位址是否與目的ip位址在同一子網中,如果有,就把它當成傳送的網路介面返回,如果沒有就返回乙個預設的網路介面。
在ip_output()函式中,先給資料報文加上ip頭部,然後比較目的ip位址與網路介面的ip位址是否在同一網段,如果不是,就必須先把資料報文傳送到閘道器,於是使用閘道器的ip位址作為目的主機,如果目的ip位址與網路介面的ip位址在同一網段,則把目的ip位址作為目的主機。接著呼叫arp_lookup()在arp快取中查詢目的主機的mac位址,找到了呼叫ethernet_output()把資料報文傳入到資料鏈路層傳送,如果找不到,就呼叫arp_query()傳送arp請求解析目的主機的mac位址。
4.arp協議的處理
arp_lookup()實現在本地arp快取中查詢目的主機的mac位址,找到了返回該mac位址,找不到返回null。
arp_query()函式中構造乙個arp請求報文,然後呼叫ethernet_output()把該報文送到資料鏈路層傳送。
5. 資料鏈路層的處理
資料鏈路層的處理就是給資料報文添上相對的乙太網頭部,然後呼叫lowlever_output()直接把報文傳送出去。
udp接收過程:
接收過程與傳送過程剛好相反,資料報文首先呼叫ethernet_input()函式到達資料鏈路層,去掉乙太網頭部之後如果是arp報文傳給呼叫arp_input()交給arp協議處理,如果是ip報文就呼叫ip_input()進入ip層處理,ip_input()函式中比較資料報文的目的ip位址,如果與某個網路介面的ip位址相同,則接收這個報文,依照ip頭部的協議字段,呼叫各自協議的輸入處理函式,本例中將呼叫udp_input(),在udp_input()中提取資料報文的埠號,然後在已登記的套接字中查詢與該埠號符合的udp接收函式,如果沒有找到相應的套接字,呼叫icmp_output()傳送乙個icmp不可達報文,如果找到了,就呼叫該函式(這個函式就是我們在udp_bind()時傳入的其中乙個引數)。
MFC中利用CSocket實現UDP通訊
這兩天一直在找mfc下用csocket實現udp通訊,嘗試了網上不少的資料都沒有成功,可能是自己在什麼地方出錯了。最後參考順利實現了。自己也順便作一些總結,希望可以利人利己。基本介面如下 udp通訊時雙方地位是對等的,不用像tcp那樣要在伺服器端設定乙個監聽socket。第一步 呼叫create函式...
MFC中TCP和UDP程式設計過程區別
tcp程式設計的伺服器端一般步驟是 1 建立乙個casyncsocket或csocket類或其子類物件a,用於監聽客戶端連線,然後通過create函式設定埠號和協議型別為 sock stream。2 開啟監聽,用函式listen 3 接收客戶端上來的連線,用函式accept b 並且把連線連線的物件...
C 中Socket通訊用法UDP方式和TCP方式
using system.net.sockets using system.net 一 udp方式 伺服器端 static void main string args remote.tostring console.writeline encoding.ascii.getstring data,0,...