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

}

标签