udp客戶/伺服器的套接字函式
recvfrom()函式: 接收資料,類似標準read();
#include
#include
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *from, size_t *addrlen);
flags引數:傳輸控制標誌
1、0:常規操作,所做的操作與read相同
2、msg_oob: 指明要讀的是帶外資料而不是一般資料
3、msg_peek: 可以檢視資料而不讀出,在接收資料後不會將這些資料丟棄。
注:由於無連線,客戶端可能接收到不同伺服器傳送的訊息,所以要對接收到的訊息的
from
進行檢查。
sendto()函式
#include
#include
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, structsockaddr * to, int addrlen);
flags引數:傳輸控制標誌
1、0:常規操作,所做的操作與read相同
2、msg_dontroute: 告訴核心的目的主機在直接連線的本地網路上,不需要查路由表
3、msg_oob: 指明傳送的是帶外資料
注:傳送乙個長度為
0 的資料報是允許的,長度為
0的是乙個包含頭部(
ipv4
頭部20
位元組,8
位元組udp
頭部和沒有資料的
ip資料報,這也意味著對於資料報協議,
revcfrom返回0
位元組也是可行的,由於
udp無連線,所以它並不表示對方已關閉連線,與tcp
套接字上的
read返回0
情況不同)
1、 資料報的丟失
資料報丟失,客戶端可能一直堵塞在recvfrom,解決辦法就是設定超時時間。
2、 驗證收到的響應
如果伺服器僅在一台具有單個ip位址的主機上執行,客戶端只用呼叫
if(len!=sizeofserver)||memcmp((const void*) &server,(const void *)&peer,len)!=0)即可。
伺服器多個ip的話乙個解決辦法:由客戶在dns中查詢伺服器主機的名字來驗證主機的網域名稱而不是ip位址。另乙個解決辦法:有udp伺服器給伺服器主機上配置的每個ip位址建立乙個套接字,並**響應的ip位址到此套接字。即用客戶請求的伺服器ip位址進行響應。
3、 伺服器未執行
客戶端sendto將產生port unreachable錯誤,伺服器會以埠不可達的icmp訊息響應,但是icmp錯誤報文不會返回給客戶程序,這種錯誤報文稱為「非同步錯誤」,但是客戶端
sendto
卻返回成功,這是由於
udp輸出操作返回成功僅僅表示在介面輸出佇列上為
ip資料報流出空間,而icmp錯誤知道很晚才返回,所以稱為非同步錯誤。
4、udp的connect函式
1)udp的connect沒有三次握手過程,完全是本地行為;
2)既然有connect,我們就要區分未連線udp套接字(預設)和已連線udp套接字(呼叫connect);
3)已連線套接字和未連線套接字的區別:
· 不用給輸出指定目的ip和埠了,即不使用sendto而是改用wirte或send;
· 不必使用recvfrom,而是使用read、recv或recvmsg;
· udp套接字引發的非同步錯誤將返回給它們的程序。
4)udp套接字多次呼叫connect可能出於以下目的:
· 指定新位址的ip位址和埠號(對於tcp,connect只能呼叫一次)
5)效能
· 未連線套接字兩次sendto執行步驟:連線套接字 -> 輸出第乙個資料報 -> 斷開套接字連線 -> 連線套接字 -> 輸出第二個資料報 ->斷開套接字連線;
· 已連線套接字兩次write的步驟:連線套接字 -> 輸出第乙個資料報 -> 輸出第二個資料報
· 從上面可看出未連線的兩次傳送資料比已經連線的兩次傳送資料複雜的多,效率自然低得多。
Linux UNIX網路程式設計
本書詳細介紹了在unix linux系統下基於tcp ip網路套介面的基本程式設計方法,包括迭代與併發伺服器編寫方法 程序與執行緒程式設計技術 i o程式設計技術 ipv4與ipv6的相容性 原始套介面 資料鏈路訪問技術 廣播與多播技術等。為滿足教學實際需要,在本書最後一章給出了socket基本程式...
linux unix網路程式設計 入門基礎
在網路中用來描述計算機中不同程式與其他電腦程式通訊的方式。為了區分不同應用程式的程序和連線,需要使用應用程式與tcp ip協議互動的套接字埠。主要用到三個引數 通訊的目的ip位址 使用的傳輸協議 tcp或udp 和使用的埠號。1.套接字相關的資料型別 套接字程式設計是,通常使用sockaddr和so...
linux unix程式設計手冊 51 55
system v ipc 和 posix ipc比較和system v 訊息佇列對比 開啟,關閉和斷開訊息佇列 include include include mqd t mq open const char name,int oflag,mode t mode,struct mq attr ofl...