udp 是面向資料報的無連線的傳輸協議,這與面向位元組流的tcp協議十分不同。所以使用socket編寫的udp程式與tcp程式也是有著本質上的區別的。
下面給出乙個典型的udp客戶/服務程式的函式呼叫過程:
伺服器:socket() –> bind() –> recvfrom() –> sendto()
客戶:socket() –> sendto() –> recvfrom() –> close()
可以看到這與典型的tcp程式有以下不同:
1.在訊息的傳送和接收中,udp沒有繼續使用read和write系統呼叫,取而代之的是函式recvfrom和sendto 這是由於udp是無連線的協議,在傳送資料之前要指定目的主機的ip位址和埠號,收到資料之後也需要通過專門的函式從資料報中獲取源主機的位址和埠。而這兩個新的函式則正是提供了這樣的功能。
2.在伺服器端,並沒有像tcp的伺服器程式那樣呼叫listen和accept,這仍然是由於udp是無連線的,所以不需要區分監聽套接字和已連線套接字,也不需要建立連線的過程。
同理在客戶端也沒有呼叫connect函式,不過事實上在udp的客戶程式中是可以使用connect建立對指定位址的連線的,這使得程式有了處理udp引起的非同步錯誤的能力。不過經connect建立的套接字也被限制只能與乙個指定的位址間交換資料報。
下面通過乙個udp回射程式的例子展示乙個udp程式的基本結構
由於只是為了熟悉編寫udp程式的基本流程,所以下面的例項中並沒有進行相關的錯誤處理,在實際的專案中應選擇將相關的函式編寫成對應的包裹函式,在包裹函式中進行錯誤處理。
伺服器
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define serv_port 8888
#define maxline 1024
int main()
}
客戶
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define serv_port 8888
#define maxline 1024
int main(int argc, char **argv)
}
乙個簡單的UDP廣播程式
一般使用的socket程式設計都是使用的是一些繫結埠和ip的普通的程式,一旦想要編寫一些特殊的網路應用程式就會出現一些問題。就那這個udp廣播資料的車姑娘許來說,需要設定socket的選項,也就是使用setsockopt來設定socket的一些特殊選項。include include include...
乙個簡單基於UDP的回顯C S 一
問題 伺服器端意外崩潰或重啟,客戶端不得而知 特點 迭代伺服器 服務端 vi s4.c include include include include include include include define serv port 9877 define maxline 4096 void ser...
乙個基於UDP的回顯C S 二
解決問題 通過connect,使伺服器端意外崩潰,重啟,客戶端能通過read函式而得知 伺服器端 vi s4.c include include include include include include include define serv port 9877 define maxline ...