socketpair

socketpair,套接字可以用於網路通信,也可以用於本機內的進程通信

套接字可以用於網路通信,也可以用於本機內的進程通信。由於本機內進程的IP位址都相同,因此只需要進程號來確定通信的雙方。非網路通信套接字在Linux環境中的套用很多,最典型的就是Linux的桌面系統——Xserver,其就是使用非網路套接字的方法進行進程之間的通信的。

Linux環境下使用socketpair函式創造一對未命名的、相互連線的UNIX域套接字。

定義

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兩次的話,那就會出錯了。一般會在子進程里調用一個帶死循環的函式,這樣就好了。

新建一對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];

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

}

相關詞條

相關搜尋

熱門詞條

聯絡我們