linux系統中的程序通訊 套接字

2021-07-22 18:35:18 字數 2949 閱讀 2158

套接字不僅支援本地無關的兩個程序之間的雙向通訊,而且支援跨網路的,執行在不同機器的程序間的通訊。

可以通過int socket(int domain,int type,int protocol)建立套接字,通過int close(int socket)關閉(銷毀)套接字,通過int shutdown(int socket,int how)斷開套接字的連線。

建立套接字

#include int socket(int domain,int type,int protocol);
domian:通訊域。

af_inet:網路通訊域,ipv4網路傳輸協議。

af_inet6:網路通訊域,ipv6網路傳輸協議。

type:套接字型別。

sock_stream:位元組流套接字。

sock_dgram:資料流套接字。

protocol:具體的某個協議(一般置為0,使用系統預設的)

返回值為套接字描述字。

關閉套接字(銷毀)

#include int close(int scoket);
scoket:套接字描述字。

斷開套接字的連線

#include int shutdown(int scoket,int how);
scoket:套接字描述字。

shut_rd:停止從此套接字接收資料。

shut_wr:停止從次套接字傳送資料。

shut_rdwr:停止從此套接字接收和傳送資料。

套接字的位址結構

/*ipv4*/

struct in_addr

;/*ipv6*/

struct in6_addr

;

字串ip位址格式和二進位制ip位址格式的互相轉換

#include int inet_aton(const char *name,struct in_addr *addr);

char * inet_ntoa(struct in_addr inaddr);

int inet_pton(int family,const char *nameptr,struct in_addr *addrptr);

consr char * inet_ntop(int family,void *addrptr,char *nameptr,size_t len);

struct hostent

獲取主機的資訊:

#include struct hostent *gethostbyname(const char *name); /*獲取主機資訊*/

struct hostent *gethostbyaddr(const char *addr,size_t length,int type);/*獲取主機資訊*/

對於網域名稱的解析是首先訪問本地的hosts檔案,如果本地hosts檔案中沒有網域名稱對應的資訊,則訪問網域名稱解析伺服器。

#include void sethostent(int stapopen); /*建立和網域名稱伺服器的鏈結*/

struct hostent *gethostent(); /*獲取一條主機資料庫的下一條記錄*/

void endhostent(); /*關閉主機位址資料庫*/

在網路通訊中套接字位址由機器ip位址和埠號組成,ip時網路中一台計算機的唯一標識,埠號是區分同一臺計算機不同的服務程序。

#include /*

*****************************************

描述服務資訊庫資訊的資料結構

*****************************************

*/struct servent

;

獲取和查詢埠號

#include struct servent *getservbyname(const char *name,const char *proto);

struct servent *getservbyport(int port,const char *proto);

/*掃瞄服務資料庫*/

void setservent(int stayopen); /*開啟資料庫準備掃瞄*/

struct servent *getservent(void);/*獲取資料庫下一條資訊*/

void endservent(void) /*關閉資料庫*/

套接字位址資料結構

(1)unix通訊域

struct scokaddr_un

(2)ipv4

struct scokaddr_in

;

(3)ipv6

struct scokaddr_in6

;

(4)通用套接字位址結構

struct sockassr

;

通過scoket在系統中建立無名的套接字,其他程序無法訪問,通過bind可以給套接字指定名字(路徑或位址,通常是只有對外提供服務的套接字),使其能夠被訪問。

#include int bind(int scoket,const struct scokaddr,socklen_t address_len);
socket:套接字描述字。

sockaddr:位址

address_len:結構體的長度

成功返回0,失敗返回-1並置errno

Linux程序間通訊 套接字

socket 也是一種程序間的通訊機制,不過它與其他通訊方式主要的區別是 它可以實現不同主機間的程序通訊。乙個套介面可以看做是程序間通訊的端點 endpoint 每個套介面的名字是唯一的 其他程序可以訪問,連線和進行資料通訊。套介面 socket 程式設計是實現 linux 系統和其他大多數作業系統...

Linux系統中的程序 執行緒間通訊

linux系統中的程序間通訊方式主要以下幾種 同一主機上的程序通訊方式 unix程序間通訊方式 管道 pipe 有名管道 fifo 和訊號 signal system v程序通訊方式 訊號量 semaphore 訊息佇列 message queue 共享記憶體 shared memory 網路主機間...

Linux系統中的程序間通訊方式

unix程序間通訊方式 包括管道 pipe 有名管道 fifo 和訊號 signal 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係 父子程序 的程序間使用。另外管道傳送的是無格式的位元組流,並且管道緩衝區的大小是有限的 管道緩衝區存在於記憶體中,在管道建立時,...