TCP UDP網路程式設計套接字

2021-10-19 06:53:58 字數 4513 閱讀 2242

tcp通訊

socket介面介紹

服務端與客戶端的步驟不同的是客戶端第三步為傳送資料第四步為接收資料

五元組:源端ip,源端埠,對端ip,對端埠,協議

一條五元組可以標識一條通訊

其中對端ip和對端埠是為了確定網路中的內一台主機和程序,網路中的資料通過對端ip傳送給目標主機之後,再通過埠號確定需要傳送到的程序

udp通訊特點:無連線,不可靠,面向資料報

服務端

客戶端

客戶端不主動繫結位址埠是為了降低埠衝突的概率

服務端需要主動繫結位址埠,因為客戶端必須知道服務端的位址埠,如果服務端不繫結位址埠,客戶端就無法傳送給服務端的請求

客戶端必須知道服務端的位址才可以傳送請求,一般來說,我們平常使用的客戶端裡面都包裝好了服務端的位址資訊

通訊順序

1 2 3

客戶端->服務端->客戶端

**建立套接字/為套接字繫結位址資訊/接收資料/傳送資料/關閉套接字

int

socket

(int domain,

int type ,

int protocol)

;//domain:位址域-確定本次socket通訊使用那種協議版本的位址結構-不同的協議版本有不同的位址結構 -- af_inet ipv4網路協議

//type:套接字型別(流式套接字-sock_stream / 資料報套接字-sock_dgram)

//protocol:協議型別(通常就是傳輸層協議的選擇 ipproto_tcp / ipproto_udp),預設為0-流式預設tcp / 資料報預設udp

//返回值:檔案描述符-非負整數--套接字所有其它介面的操作控制代碼;失敗返回-1

int

bind

(int sockfd,

struct sockaddr *addr, socklen_t len)

;//sockfd:建立套接字返回的操作控制代碼

//addr:要繫結的位址資訊

//len:要繫結的位址首席資訊官度

struct sockaddr
struct sockaddr_in

sin_addr;

//ip位址

}

struct sockaddr_un
bind可以繫結不同的位址結構,為了實現介面統一,因此使用者定義位址結構的時候,定義自己需要的位址結構(例如: ipv4就使用struct sockaddr_in),但是進行繫結的時候,統一型別強轉成為sockaddr 型別*

bind

(fd,

struct sockaddr *addr, len)

else

if(addr-

>sa_family == af_inet6)

else

if(addr-

>sa_family == af_local)

}

ssize_t recvfrom

(int sockfd,

char

*buf,

int len,

int flag,

struct sockaddr *peer_addr, socklen_t *addrlen)

//sockfd: socket操作控制代碼

//buf:一塊緩衝區,用於接收從接收緩衝區中取出的資料

//len:想要接收的資料長度

//flag:操作選項標誌,預設為0,表示阻塞操作

//peer_addr:傳送的位址資訊

//addrlen:想要獲取的位址首席資訊官度以及返回實際長度

//返回值:成功返回實際接收到的資料位元組長度;失敗返回-1

ssize_t sendto

(int sockfd,

char

*data,

int len ,

int flag,

struct sockaddr *peer_addr, socklen_t addrlen)

//sockfd:sock操作控制代碼

//data:要傳送的資料首位址

//len: 要傳送的資料長度

//flag:預設為0,表示阻塞操作

//返回值:成功返回實際傳送的資料的位元組長度;失敗返回-1

int

close

(int fd)

;

tcp通訊特點:面向連線,可靠傳輸,面向位元組流

服務端

客戶端

注意

客戶端對應埠傳送的資料會放到服務端的對應的socket的接收緩衝區中進行處理

監聽套接字,只接收第一次的連線請求,接收後新建乙個套接字,這個新建的套接字與這個客戶端埠號對應起來(一對一),之後的建立連線的過程和資料通訊都由這個新建的套接字完成

tcp通訊缺點

程序實現

int

socket

(int domain,

int type,

int protocol)

;//domain:位址域-確定本次socket通訊使用那種協議版本的位址結構-不同的協議版本有不同的位址結構 -- af_inet ipv4網路協議

//type:套接字型別(流式套接字-sock_stream / 資料報套接字-sock_dgram)

//protocol:協議型別(通常就是傳輸層協議的選擇 ipproto_tcp / ipproto_udp),預設為0-流式預設tcp / 資料報預設udp

//返回值:檔案描述符-非負整數--套接字所有其它介面的操作控制代碼;失敗返回-1

int

bind

(int sockfd,

struct sockaddr *addr, socklen_t len)

;

listen

(int sockfd,

int backlog)

;//sockfd:將那個套接字設定為監聽狀態,並且監聽狀態後可以開始接收客戶端連線請求

//backlog:同一時間的併發連線數,決定同一時間最多接收多少個客戶端的連線請求(防止惡意操作,不斷傳送連線請求)

int

accept

(int sockfd,

struct sockaddr *addr, socklen_t *len)

//sockfd:監聽套接字,表示要獲取那個tcp服務端套接的新建連線

//cli_addr:這個新的套接字對應的客戶端位址資訊 / len:位址首席資訊官度

//返回值:是新建socket套接字的描述符 --- 外部程式中的操作控制代碼

ssize_t recv

(int sockfd,

char

*buf,

int len,

int flag)

;//預設阻塞,沒有資料等待,

返回值:連線斷開返回0,不再阻塞,出錯返回值小於0,返回值大於0表示實際接收的資料長度

ssize_t send

(int sockfd,

char

*data,

int len,

int flag)

;//預設阻塞,緩衝區資料滿了則等待,連線斷開仍舊繼續傳送資料則觸發sigpipe異常

int

close

(fd)

;

int

connect

(int sockfd,

struct sockaddr *srv_addr,

int len)

;//srv_addr:服務端位址資訊

//connect這個介面會在sockfd的套接字socket中描述對端位址資訊

udp與tcp總結

udp就比如發簡訊,只需要知道目標的手機號就可以傳送簡訊

tcp就比如打**,不僅需要知道目標的手機號,還需要等到目標接通之後才能通話

什麼是面向連線:必須建立連線,保證通訊雙方都具有資料收發的能力,才可以進行通訊

網路套接字程式設計

1。位元組序 小位元組 低位儲存在低位元組 大位元組 低位儲存在高位元組 簡單程式判斷 int islittle 2.hostent結構 struct hostent define h addr h addr list 0 這裡是這個資料結構的詳細資料 struct hostent h name 位...

網路程式設計套接字

建立 函式原型 int socket int domain int type int protocol 引數說明 domain 協議域,又稱協議族 family 常用的協議族有af inet af inet6 af local 或稱af unix,unix域socket af route等。協議族決...

網路程式設計套接字

本節重點 本節重點需要掌握的是 基本概念 1.認識ip位址 同樣的問題,整個西天取經過程中,直到ip位址 從長安到西天 只知道這個不能完成取經 需要直到從長安的誰那得到的資訊到西天的誰那拿經 唐太宗 如來佛 有了ip位址 長安 西天 和埠號 唐太宗 如來佛 才能完成取經。引出了下面的埠號的概念。2....