一. Unix域套接字
1. 描述符传递 && 接收发送者的凭证用到的时候再看
2. struct sockaddr_un
3. socketpair
4. 书上有三四个例子,跟着学习一下如何创建一个Unix域套接字
二. 书上内容的补充
三.学习创建一个Unix域C/S
使用Unix域协议的理由
1.Unix域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍。
2.Unix域套接字可用于在同一个主机上的不同进程之间传递描述符。
3.Unix域套接字较新的实现把客户的凭证(用户ID和组ID)提供给服务器,从而能够提供额外的安全检查措施。
以上其实就是第15章的三大内容,但是目前我们只学最基础的使用,然后使用unix域套接字进行进程间的通信即可.
具体例子
- 书上的三个例子.包括创建Unix域绑定地址的测试,Unix域客户,Unix域服务器
- 刚才链接中对socketpair用法示例,这个很重要,如下.
测试同一进程间的unix域通信
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <error.h>
#include <errno.h>
#include <sys/socket.h>
#include <stdlib.h>
const char* str = "SOCKET PAIR TEST.";
int main(int argc, char* argv[]){
char buf[128] = {0};
int socket_pair[2];
pid_t pid;
if(socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair) == -1 ) {
printf("Error, socketpair create failed, errno(%d): %s\n", errno, strerror(errno));
return EXIT_FAILURE;
}
pid = fork();
if(pid < 0) {
printf("Error, fork failed, errno(%d): %s\n", errno, strerror(errno));
return EXIT_FAILURE;
} else if(pid > 0) {
//关闭另外一个套接字
close(socket_pair[1]);
int size = write(socket_pair[0], str, strlen(str));
printf("Write success, pid: %d\n", getpid());
} else if(pid == 0) {
//关闭另外一个套接字
close(socket_pair[0]);
read(socket_pair[1], buf, sizeof(buf));
printf("Read result: %s, pid: %d\n",buf, getpid());
}
for(;;) {
sleep(1);
}
return EXIT_SUCCESS;
}
测试不同进程间的unix域通信
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <error.h>
#include <errno.h>
#include <sys/socket.h>
#include <stdlib.h>
const char* str = "SOCKET PAIR TEST.";
int
main(int argc,char** argv)
{
int sockfd[2];
pid_t pid;
char buf[8192];
socketpair(AF_LOCAL,SOCK_STREAM,0,sockfd);
if((pid = fork()) > 0)
{
close(sockfd[1]);
write(sockfd[0],str,strlen(str));
printf("father has write: %s\n",str);
}else if (pid == 0){
close(sockfd[0]);
read(sockfd[1],buf,sizeof(buf));
printf("child has read: %s\n",buf);
}
return 0;
}
下一章: 第14章 学习各种IO函数