天天看點

c++ linux socket udp tcp 差別,TCP 和 UDP 在socket程式設計中的差別

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、關閉網絡連接配接;