UNP 学习笔记 第十五章

一. Unix域套接字

1. 描述符传递 && 接收发送者的凭证用到的时候再看
2. struct sockaddr_un
3. socketpair
4.  书上有三四个例子,跟着学习一下如何创建一个Unix域套接字

二. 书上内容的补充

1.基础
2.socketpair

三.学习创建一个Unix域C/S

使用Unix域协议的理由

1.Unix域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍。
2.Unix域套接字可用于在同一个主机上的不同进程之间传递描述符。
3.Unix域套接字较新的实现把客户的凭证(用户ID和组ID)提供给服务器,从而能够提供额外的安全检查措施。

以上其实就是第15章的三大内容,但是目前我们只学最基础的使用,然后使用unix域套接字进行进程间的通信即可.

具体例子

  1. 书上的三个例子.包括创建Unix域绑定地址的测试,Unix域客户,Unix域服务器
  2. 刚才链接中对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函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值