網路程式設計套接字

2021-08-20 13:08:37 字數 3675 閱讀 4532

建立

函式原型:

int socket(int 

domain

, int 

type

, int 

protocol

);引數說明:

domain

:協議域,又稱協議族(family)。常用的協議族有af_inet、af_inet6、af_local(或稱af_unix,unix域socket)、af_route等。協議族決定了socket的位址型別,在通訊中必須採用對應的位址,如af_inet決定了要用ipv4位址(32位的)與埠號(16位的)的組合、af_unix決定了要用乙個絕對路徑名作為位址。

type

:指定socket型別。常用的socket型別有sock_stream、sock_dgram、sock_raw、sock_packet、sock_seqpacket等。流式socket(sock_stream)是一種面向連線的socket,針對於面向連線的tcp服務應用。資料報式socket(sock_dgram)是一種無連線的socket,對應於無連線的

udp服務應用。

protocol

:指定協議。常用協議有ipproto_tcp、ipproto_udp、ipproto_stcp、ipproto_tipc等,分別對應tcp傳輸協議、udp傳輸協議、stcp傳輸協議、tipc傳輸協議。

注意:1.type和protocol不可以隨意組合,如sock_stream不可以跟ipproto_udp組合。當第三個引數為0時,會自動選擇第二個引數型別對應的預設協議。

2.windowssocket下

protocol

引數中不存在ipproto_stcp

返回值:

如果呼叫成功就返回新建立的

套接字的描述符,如果失敗就返回invalid_socket(linux下失敗返回-1)。套接字描述符是乙個整數型別的值。每個程序的程序空間裡都有乙個套接字描述符表,該表中存放著套接字描述符和套接字資料結構的對應關係。該表中有乙個字段存放新建立的套接字的描述符,另乙個字段存放套接字資料結構的位址,因此根據套接字描述符就可以找到其對應的套接字資料結構。每個程序在自己的程序空間裡都有乙個套接字描述符表但是套接字資料結構都是在作業系統的

核心緩衝裡。

繫結函式原型:

int bind(socket 

socket

, const struct sockaddr* 

address

, socklen_t 

address_len

);引數說明:

socket

:是乙個

套接字描述符。

address

:是乙個sockaddr結構

指標,該結構中包含了要結合的位址和

埠號。

address_len

:確定address

緩衝區的長度。

返回值:

如果函式執行成功,返回值為0,否則為socket_error。

接收函式原型:

int recv(socket 

socket

, char far* 

buf, int 

len, int 

flags

);引數說明: s

ocket

:乙個標識已連線

套介面的描述字。

buf:用於接收資料的

緩衝區。

len:緩衝區長度。

flags

:指定呼叫方式。取值:msg_peek 檢視當前資料,資料將被複製到緩衝區中,但並不從輸入佇列中刪除;msg_oob 處理

帶外資料。

返回值:

若無錯誤發生,recv()返回讀入的位元組數。如果連線已中止,返回0。否則的話,返回socket_error錯誤,應用程式可通過wsagetlasterror()獲取相應

錯誤**。

函式原型:

ssize_t recvfrom(int 

sockfd

, void 

buf, int 

len, unsigned int 

flags

, struct socketaddr* 

from

, socket_t* 

fromlen

);引數說明:

sockfd

:標識乙個已連線

套介面的描述字。

buf:接收

資料緩衝區。

len:緩衝區長度。

flags

(1)msg_dontwait:操作不會被阻塞;

(2)msg_errqueue: 指示應該從套接字的錯誤佇列上接收錯誤值,依據不同的協議,錯誤值以某種輔佐性訊息的方式傳遞進來,使用者應該提供足夠大的緩衝區。導致錯誤的原封包通過msg_iovec作為一般的資料來傳遞。導致錯誤的資料報原目標位址作為msg_name被提供。錯誤以sock_extended_err結構形態被使用。

(3)msg_peek:指示資料接收後,在接收佇列中保留原資料,不將其刪除,隨後的讀操作還可以接收相同的資料。

(4)msg_trunc:返回封包的實際長度,即使它比所提供的緩衝區更長, 只對packet套接字有效。

(5)msg_waitall:要求阻塞操作,直到請求得到完整的滿足。然而,如果捕捉到訊號,錯誤或者連線斷開發生,或者下次被接收的資料型別不同,仍會返回少於請求量的資料。

(6)msg_eor:指示記錄的結束,返回的資料完成乙個記錄。

(7)msg_trunc:指明資料報尾部資料已被丟棄,因為它比所提供的緩衝區需要更多的空間。

/*(msg_trunc使用錯誤,4才是msg_trunc的正確解釋)*/

(8)msg_ctrunc:指明由於緩衝區空間不足,一些控制資料已被丟棄。

(9)msg_oob:指示接收到out-of-band資料(即需要優先處理的資料)。

(10)msg_errqueue:指示除了來自套接字錯誤佇列的錯誤外,沒有接收到其它資料。

from

:(可選)

指標,指向裝有源位址的緩衝區。

fromlen

:(可選)指標,指向from緩衝區長度值。

傳送函式原型:

int sendto( socket 

s, const char far* 

buf, int 

size

, int 

flags

, const struct sockaddr far* 

to, int 

tolen

);引數說明:s:

套接字buf:待傳送資料的緩衝區

size

:緩衝區長度

flags

:呼叫方式標誌位, 一般為0, 改變flags,將會改變sendto傳送的形式

addr

:(可選)

指標,指向目的套接字的位址

tolen

返回值:

如果成功,則返回傳送的位元組數,失敗則返回socket_error。

接收連線請求

函式原型:

int accept( int 

fd, struct socketaddr* 

addr

, socklen_t* 

len);引數說明:

fd:套接字描述符。

addr

len返回值:

成功返回客戶端的檔案描述符,失敗返回-1。

網路套接字程式設計

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

網路程式設計套接字

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

網路套接字程式設計

目錄 1.基本概念 1.1 ip位址 1.2 port埠號 1.3 五元組 1.4 位元組序 2.套接字程式設計 2.1 概念 2.2 基於udp協議實現網路通訊 2.2.1 客戶端 2.3 基於tcp協議實現網路通訊 ipv6 16個位元組 由於不向下相容ipv4,因此不被廣泛使用。資料型別 無符...