管道內部傳輸的是位元組流,tcp socket傳輸的也是位元組流,區別在於:
socket的基礎api中有乙個socketpair函式。它能夠方便的建立雙向管道:
#
include
#include
/** socketpair()函式用於建立一對無名的、相互連線的套接子。
* 引數: domain必須是unix本地域協議族af_unix(因為僅能在本地使用這個雙向管道) sv[0]可讀可寫; sv[1] 可讀可寫
* 返回值:如果函式成功,則返回0,建立好的套接字分別是sv[0]和sv[1];否則返回-1,錯誤碼儲存於errno中。
*/int
socketpair
(int domain,
int type,
int protocol,
int sv[2]
);
1、引數type、protocol
和socket的type、protocol一樣
protocol 引數必須為 0。
sockfd陣列返回了引用這兩個相互連線的 socket 的檔案描述符
2、基本用法
這對套接字可以用於全雙工通訊,每乙個套接字既可以讀也可以寫。例如,可以往sv[0]中寫,從sv[1]中讀;或者從sv[1]中寫,從sv[0]中讀;
如果往乙個套接字(如sv[0])中寫入後,再從該套接字讀時會阻塞,只能在另乙個套接字中(sv[1])上讀成功;
讀、寫操作可以位於同乙個程序,也可以分別位於不同的程序,如父子程序。如果是父子程序時,一般會功能分離,乙個程序用來讀,乙個用來寫。因為檔案描述副sv[0]和sv[1]是程序共享的,所以讀的程序要關閉寫描述符, 反之,寫的程序關閉讀描述符。
#
include
#include
#include
#include
#include
#include
#include
#include
const
char
* str =
"socket pair test."
;int
main
(int argc,
char
* ar**)
;int socket_pair[2]
; pid_t pid;if(
socketpair
(af_unix, sock_stream,
0, socket_pair)==-
1)int size =
write
(socket_pair[0]
, str,
strlen
(str));
//可以讀取成功;
read
(socket_pair[1]
, buf, size)
;printf
("read result: %s\n"
,buf)
;return exit_success;
}
#
include
#include
#include
#include
#include
#include
#include
#include
const
char
* str =
"socket pair test."
;int
main
(int argc,
char
* ar**)
;int socket_pair[2]
; pid_t pid;if(
socketpair
(af_unix, sock_stream,
0, socket_pair)==-
1)pid =
fork()
;if(pid <0)
else
if(pid >0)
else
if(pid ==0)
for(;;
)return exit_success;
}
詳情請參見linux c/c++程式設計:資料讀寫 sock程式設計學習2
面向連線的服務sock stream sock seqpacket,在開始交換資料之前,需要在請求服務的程序套接字和提供服務的程序套接字之間建立乙個連線 客戶端通過呼叫connect.int connect int sockfd const struct addr,socklen t len 在co...
UNIX LINUX程式設計書籍
排名不分先後 1.c語言 高質量程式設計指南 c語言介面與實現 c語言解惑 c專家程式設計 c陷阱與缺陷 c語言參考手冊 2.linux應用開發 unix網路程式設計 第1,2卷 unix環境高階程式設計 linux系統程式設計 unix linux程式設計實踐教程 linux程式設計 第3版 un...
linux socket網路程式設計之socket屬性
1.函式用法 include include int getsockopt int sockfd,int level,int optname,void optval,socklen t optlen 函式用於獲得某個套接字的屬性 int setsockopt int sockfd,int level...