http://blog.chinaunix.net/uid-26421509-id-3814684.html
一、TCP與UDP的差別
基于連接配接與無連接配接
對系統資源的要求(TCP較多,UDP少)
UDP程式結構較簡單
流模式與資料報模式
TCP保證資料正确性,UDP可能丢包
TCP保證資料順序,UDP不保證
部分滿足以下幾點要求時,應該采用UDP 面向資料報方式 網絡資料大多為短消息
擁有大量Client
對資料安全性無特殊要求
網絡負擔非常重,但對響應速度要求高
具體程式設計時的差別 socket()的參數不同
UDP Server不需要調用listen和accept
UDP收發資料用sendto/recvfrom函數
TCP:位址資訊在connect/accept時确定
UDP:在sendto/recvfrom函數中每次均 需指定位址資訊
UDP:shutdown函數無效
二、man----socket
通過檢視socket的man手冊可以看到socket函數的第一個參數的值可以為下面這些值:
Name Purpose
PF_UNIX, PF_LOCAL Local communication
PF_INET IPv4 Internet protocols
PF_INET6 IPv6 Internet protocols
PF_IPX IPX - Novell protocols
PF_NETLINK Kernel user interface device
PF_X25 ITU-T X.25 / ISO-8208 protocol
PF_AX25 Amateur radio AX.25 protocol
PF_ATMPVC Access to raw ATM PVCs
PF_APPLETALK Appletalk
PF_PACKET Low level packet interface
三、程式設計差別
通常我們在說到網絡程式設計時預設是指TCP程式設計,即用前面提到的socket函數建立一個socket用于TCP通訊,函數參數我們通常填為SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),這表示建立一個socket用于流式網絡通訊。
SOCK_STREAM這種的特點是面向連接配接的,即每次收發資料之前必須通過connect建立連接配接,也是雙向的,即任何一方都可以收發資料,協定本身提供了一些保障機制保證它是可靠的、有序的,即每個包按照發送的順序到達接收方。
而SOCK_DGRAM這種是User Datagram Protocol協定的網絡通訊,它是無連接配接的,不可靠的,因為通訊雙方發送資料後不知道對方是否已經收到資料,是否正常收到資料。任何一方建立一個socket以後就可以用sendto發送資料,也可以用recvfrom接收資料。根本不關心對方是否存在,是否發送了資料。它的特點是通訊速度比較快。大家都知道TCP是要經過三次握手的,而UDP沒有。
基于上述不同,UDP和TCP程式設計步驟也有些不同,如下:
TCP程式設計的伺服器端一般步驟是:
1、建立一個socket,用函數socket();
2、設定socket屬性,用函數setsockopt(); * 可選
3、綁定IP位址、端口等資訊到socket上,用函數bind();
4、開啟監聽,用函數listen();
5、接收用戶端上來的連接配接,用函數accept();
6、收發資料,用函數send()和recv(),或者read()和write();
7、關閉網絡連接配接;
8、關閉監聽;
TCP程式設計的用戶端一般步驟是:
1、建立一個socket,用函數socket();
2、設定socket屬性,用函數setsockopt();* 可選
3、綁定IP位址、端口等資訊到socket上,用函數bind();* 可選
4、設定要連接配接的對方的IP位址和端口等屬性;
5、連接配接伺服器,用函數connect();
6、收發資料,用函數send()和recv(),或者read()和write();
7、關閉網絡連接配接;
與之對應的UDP程式設計步驟要簡單許多,分别如下:
UDP程式設計的伺服器端一般步驟是:
1、建立一個socket,用函數socket();
2、設定socket屬性,用函數setsockopt();* 可選
3、綁定IP位址、端口等資訊到socket上,用函數bind();
4、循環接收資料,用函數recvfrom();
5、關閉網絡連接配接;
UDP程式設計的用戶端一般步驟是:
1、建立一個socket,用函數socket();
2、設定socket屬性,用函數setsockopt();* 可選
3、綁定IP位址、端口等資訊到socket上,用函數bind();* 可選
4、設定對方的IP位址和端口等屬性;
5、發送資料,用函數sendto();
6、關閉網絡連接配接;