Linux c 基于socket文件的进程通信—对等模型

基于socket文件的进程通信:

     Socket文件进程通信方式,比较重要,原因:网络业采用这种通信模型。

     两种模型:

              对等模型

              C/S模型(服务器客户端模型)

 

1.      对等模型:

1.      建立socket

#include<sys/socket.h>

    1.建立socket:socket

                                        intsocket(

int domain,//地址族的类型AF_UNIX (绑定在本地) AF_INET(绑定在网卡)

            int type,//支持的数据格式:流SOCK_STREAM/报文SOCK_DGRAM

                                   int protocol);//支持的协议,建议为0

                                        返回值:

                                                      成功返回文件描述符号。

                                                      失败返回-1;

2.绑定在地址上(文件目录地址)URL(Universe ResourceLocation)

                                        协议://路径/文件名

                                        file:///usr/bin/ls      普通文件

                                        http://192.168.0.72/index.php

                                 structsockaddr;  地址结构体

 

                   #include<linux/un.h>

                                        structsockaddr_un;   un=unix(绑定unix本地)

                       struct sockaddr_un{

                              sa_family_t   sun_family; /*AF_UNIX*/

                              char sun_path[UNIX_PATH_MAX];

                       };

 

                                        structsockaddr_in;   in=internet(绑定网卡)

                                        intbind(int fd,//socket描述符号

                                                      structsockaddr*addr,//绑定地址

                                                      socklen_tsize);//地址长度

                       返回值:0成功,-1失败

                                                     

                                       

     3.接收数据

            read/recv/recvfrom

     4.关闭socket

 

 连接方:         

     1.建立socket:socket

     2.连接到目标:connect(可选)      

 int connect(int sockfd , const struct sockaddr * serv_addr , socklen_taddrlen);

 参数:和bind一样

  返回值:0成功,-1失败   

     3.发送数据:write/send/sendto

     4.关闭close

 

 

案例:

socketA.c

 

#include<sys/socket.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<unistd.h>

#include<linux/un.h>

 

void   main()

{

           int fd;

           int r;

           char buf[];

           //1.建立socket

            fd=socket(AF_UNIX , SOCK_DGRAM , 0);  //AF_FILE 等同//AF_UNIX

             if(fd == -1)  printf(“socket error:%m\n”) , exit(-1);

             //2.构造本地文件地址

             struct   sockaddr_un addr={0};

             addr.sun_family=AF_UNIX; //必须跟socket的地址族一致

             memcpy(addr.sun_path , “my.sock”,strlen(“my.sock”));

             //3.把socket绑定在地址上

             r=bind(fd , (struct  sockaddr *)&addr , sizeof(addr));

             if(r== -1) printf(“bind error:%m\n”), exit(-1);

             //4.接收数据

             bzero(buf , sizeof(buf));

             r=read(fd , buf , sizeof(buf));

             buf[r]=0;

             printf(“%s\n”,buf);

             //5.关闭

             close(fd);

             //6.删除socket文件

             unlink(“my.sock”);

//socket文件不会自动删除,需要在程序结尾去删除该文件,否则,再次运行//A程序出错

          

}

 

 

 

SocketB.c

#include<stdio.h>

#include<stdlib.h>

#include<sys/socket.h>

#include<linux/un.h>

#include<string.h>

#include<unistd.h>

 

void   main()

{

       int  fd;

       struct  sockaddr_un  addr={0};

      //1.建立socket

      fd=socket(AF_UNIX , SOCK_DGRAM , 0);

      //2.连接到指定的地址

      addr.sun_family=AF_UNIX;

      memcpy(addr.sun_path, “my.sock” ,strlen(“my.sock”));

      r=connect(fd , (sockaddr *)&addr ,sizeof(addr));

      //3.发送数据

      write(fd, “hello !”,strlen(“hello!”));

      //4.关闭

      close(fd);

}

 

 

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Y_23k_bug

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值