當前位置:編程學習大全網 - 源碼下載 - socket的常用函數

socket的常用函數

函數原型:

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);

參數說明:  

socket:壹個標識已連接套接口的描述字。

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:調用操作方式。是以下壹個或者多個標誌的組合體,可通過or操作連在壹起:

(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:addr所指地址的長度

返回值:

如果成功,則返回發送的字節數,失敗則返回SOCKET_ERROR。 函數原型:

int accept( int fd, struct socketaddr* addr, socklen_t* len);

參數說明:

fd:套接字描述符。

addr:返回連接著的地址

len:接收返回地址的緩沖區長度

返回值:

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

  • 上一篇:Jpasave源代碼
  • 下一篇:怎樣判斷tomcat線程池太小
  • copyright 2024編程學習大全網