基本介紹
- 外文名:socketpair
- 性質:科學
- 類別:計算機
- 屬於:編程
新建一對socket,用socketpair實現父子進程雙工通信,
套接字可以用於網路通信,也可以用於本機內的進程通信。由於本機內進程的IP位址都相同,因此只需要進程號來確定通信的雙方。非網路通信套接字在Linux環境中的套用很多,最典型的就是Linux的桌面系統——Xserver,其就是使用非網路套接字的方法進行進程之間的通信的。
定義
int socketpair(int d, int type, int protocol, int sv[2]);描述
建立一對匿名的已經連線的套接字
socketpair函式概要如下:
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
sys/types.h檔案需要用來定義一些C宏常量。sys/socket.h檔案必須包含進來定義socketpair函式原型。
socketpair函式需要四個參數。他們是:
套接口的域
套接口類型
使用的協定
指向存儲檔案描述符的指針
類型參數聲明了我們希望創建哪種類型的套接口。socketpair函式的選擇如下:
SOCK_STREAM
SOCK_DGRAM
對於socketpair函式,protocol參數必須提供為0。
參數sv[2]是接收代表兩個套接口的整數數組。每一個檔案描述符代表一個套接口,並且與另一個並沒有區別。
如果函式成功,將會返回0值。否則將會返回-1表明創建失敗,並且errno來表明特定的錯誤號。
關於流程。socketpair()函式創建出兩個進程,fork()之後這兩個進程都會執行主程式中的代碼,這個一定要注意!尤其是bind的時候,如果bind兩次的話,那就會出錯了。一般會在子進程里調用一個帶死循環的函式,這樣就好了。
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
sys/types.h檔案需要用來定義一些C宏常量。sys/socket.h檔案必須包含進來定義socketpair函式原型。
socketpair函式需要四個參數。他們是:
套接口的域
套接口類型
使用的協定
指向存儲檔案描述符的指針
類型參數聲明了我們希望創建哪種類型的套接口。socketpair函式的選擇如下:
SOCK_STREAM
SOCK_DGRAM
對於socketpair函式,protocol參數必須提供為0。
參數sv[2]是接收代表兩個套接口的整數數組。每一個檔案描述符代表一個套接口,並且與另一個並沒有區別。
如果函式成功,將會返回0值。否則將會返回-1表明創建失敗,並且errno來表明特定的錯誤號。
關於流程。socketpair()函式創建出兩個進程,fork()之後這兩個進程都會執行主程式中的代碼,這個一定要注意!尤其是bind的時候,如果bind兩次的話,那就會出錯了。一般會在子進程里調用一個帶死循環的函式,這樣就好了。
新建一對socket
int sockets[2];
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) < 0) {
printf("error %d on socketpair\n", errno);
}
用socketpair實現父子進程雙工通信
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void err_sys(const char *errmsg);
int main(void)
{
int sockfd[2];
pid_t pid;
if ((socketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd))<0)
err_sys("socketpair");
if ((pid = fork()) == -1)
err_sys("fork");
else if (pid == 0)
{ /* child process */
char s[BUFSIZ];
char s[BUFSIZ];
ssize_t n;
close(sockfd[1]); //write port
close(sockfd[1]); //write port
if ((n = read(sockfd[0], s, sizeof(s))) <0)
err_sys("read error!\n");
printf("read:%s\n",s);
close(sockfd[0]);
exit(0);
}
else if (pid > 0)
{ /* parent process */
char buf[] = "hello china";
ssize_t n;
close(sockfd[0]); //read port
if((n = write(sockfd[1], buf, sizeof(buf)))<0)
err_sys("write error!\n");
close(sockfd[1]);
wait(NULL);
}
}
return 0;
}
void err_sys(const char *errmsg)
{
perror(errmsg);
exit(1);
}