1. 程式人生 > >套接字socket---介面函式

套接字socket---介面函式

套接字socket---介面函式

 

建立套接字

socket系統呼叫建立一個套接字,並返回一個描述符,該描述符可以用來訪問這個套接字。建立的套接字是一條通訊鏈路的一個端點。

#include <sys/types.h>
#include <sys/socket.h>
int socket( int domain, int type, int protocol);

  • domain:指定域
  • type:指定套接字的通訊型別
  • protocol:指定使用的協議

 

 

套接字地址

每個套接字域都有自己的地址格式。
 AF_UNIX:

地址格式由sockaddr_un來描述

struct sockaddr_un{
sa_family_t sun_family; /*AF_UNIX*/
char  sun_path[]; /*pathname*/
}

AF_INET:地址格式由sockaddr_in來指定

struct sockaddr_in{
short int sin_family; /*AF_INET*/
unsigned short int sin_port;
struct in_addr sin_addr
}

 

 

命名套接字

要想讓通過socket呼叫建立的套接字可以被其他程序使用,伺服器程式必須給套接字命名,這樣AF_UNIX套接字才會關聯到一個檔案系統的路徑名上,AF_INET套接字關聯到一個IP的埠上。

bind呼叫把引數address中的地址分配給檔案描述符socket關聯的未命名套接字,地址長度由address_len來傳遞。

#include <sys/socket.h>
int bind(int socket, const struct sockaddr* address, size_t address_len);

 

 

建立套接字佇列

為了能夠在套接字上接受進入的連線,伺服器程式必須建立一個佇列來保持未處理的請求,它用listen系統呼叫來完成這一工作。

#include <sys/socket.h>
int listen

( int socket, int backlog);

當伺服器正忙於處理一個客戶請求時,後續的客戶連線放入佇列等待處理。函式執行成功返回0,失敗返回-1.
套接字佇列中,等待處理的進入連線的個數最多不能超過backlog這個數字,多出的連線請求將被拒絕,導致客戶連線失敗。

 

 

接受連線

一旦伺服器程式建立並命名了套接字之後,就可以通過accept系統呼叫來等待客戶建立對該套接字的連線。

#include <sys/socket.h>
int accept( int socket, struct sockaddr* address, size_t* address_len);

accept函式只有當客戶程式試圖連線到由socket引數指定的套接字上時才返回,否則將一直阻塞。
accept函式將建立一個新的套接字來與該客戶通訊,並且返回新套接字的描述符,新套接字的型別與伺服器監聽套接字一致。

 

 

請求連線

客戶程式通過在一個未命名套接字與伺服器監聽套接字之間建立連線,以此來連線到伺服器。

#include <sys/socket.h>
int connect( int socket, struct sockaddr* address, size_t* address_len);

引數socket指定的套接字將連線到引數address指定的伺服器套接字,address指向的結構長度由引數address_len指定。

如果連線不能立刻建立,connect呼叫將阻塞一段不確定的超時時間。一旦超時時間到達,連線將被放棄,connect呼叫失敗。