本地套接字通信

利用本地套接字,也可以进程间通信。

本地套接字和有名管道一样都利用伪文件

管道的文件类型是p

本地套接字的文件类型是s。

当调用bind函数后,就会生成本地套接字对应的伪装文件

srwxr-xr-x 1 ys ys     0 7月   2 10:55 server.socket
srwxr-xr-x 1 ys ys 0 7月 2 10:55 client.socket

和网络套接字不同的地方是:

  • 使用的结构体不一样,本地套接字使用:
struct sockaddr_un{
sun_family;//AF_LOCAL
sun_path;//本地套接字对应的伪装文件的名字,可以加路径
}
  • 客户都也必须调用bind函数
  • 需要头文件:sys/un.h
  • 需要提前删除上次执行生成的伪装文件,如果不删除的话,bind函数会执行失败,错误信息:Address already in use

接收端例子:

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> int main(){
int fd = socket(AF_LOCAL, SOCK_STREAM, 0); unlink("server.socket"); struct sockaddr_un serv;
strcpy(serv.sun_path, "server.socket");
serv.sun_family = AF_LOCAL;
int ret = bind(fd, (struct sockaddr*)&serv, sizeof(serv));
if(ret == -1){
perror("bind error");
exit(1);
} listen(fd, 64); struct sockaddr_un cli;
socklen_t len;
int cfd = accept(fd, (struct sockaddr*)&cli, &len); while(1){
char buf[64];
ret = recv(cfd, buf, sizeof(buf), 0);
if(ret == -1){
perror("recv error");
exit(1);
}
else if(ret == 0){
printf("client closed\n");
close(cfd);
}
printf("clinet path:%s\n", cli.sun_path);
write(STDOUT_FILENO, buf, ret);
} close(cfd);
close(fd);
}

发送端例子:

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h> int main(){
int fd = socket(AF_LOCAL, SOCK_STREAM, 0); unlink("client.socket"); struct sockaddr_un cli;
strcpy(cli.sun_path, "client.socket");
cli.sun_family = AF_LOCAL;
if(bind(fd, (struct sockaddr*)&cli, sizeof(cli)) == -1){
perror("bind cli error");
exit(1);
} struct sockaddr_un to;
to.sun_family = AF_LOCAL;
strcpy(to.sun_path, "server.socket"); int ret = connect(fd, (struct sockaddr*)&to, sizeof(to)); int cnt = 0;
while(1){
char buf[64] = {0};
sprintf(buf, "cnt = %d", cnt++);
int ret = send(fd, buf, sizeof(buf), 0);
if(ret == -1){
perror("send error");
exit(1);
}
sleep(1);
}
}

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

linux 本地套接字通信的更多相关文章

  1. Linux本地套接字(Unix域套接字)----SOCK_DGRAM方式

    目录 简述 创建服务端代码: 创建客户端代码 接收函数封装 发送封装 服务端测试main函数 客户端测试main函数 编译运行结果 简述 这里介绍一下Linux进程间通信的socket方式---Loc ...

  2. IPC——流套接字通信

    Linux进程间通信——使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进 ...

  3. Linux/UNIX套接字连接

    套接字连接 套接字是一种通信机子.凭借这样的机制.客户/server系统的开发工作既能够在本地单机上进行.也能够夸网络进行. 套接字的创建和使用与管道是有差别的.由于套接字明白地将客户和server区 ...

  4. Linux编程---套接字

    网络相关的东西差点儿都是建立在套接字之上.所以这个内容对于程序猿来说还是蛮重要的啊. 事实上套接字也就是一个特殊的设备文件而已,我始终不能明确为什么要叫套接字.这么个奇怪的名字.只是还是就这样算了吧. ...

  5. 网络编程 - 1.简单的套接字通信/2.加上通信循环/3.bug修复/4.加上链接循环/5.模拟ssh远程执行命令

    1.简单的套接字通信 服务端 ''' 服务端 接电话 客户端 打电话 1.先启动服务端 2.服务端有两种套接字 1.phone 用来干接收链接的 2.conn 用来干收发消息的 ''' import ...

  6. linux netlink套接字学习资料

    理论: http://blog.csdn.net/unbutun/article/details/3394061 进一步深入: http://edsionte.com/techblog/archive ...

  7. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字 server.bind() #把地址绑定到套接字,网络地址加端口 server.lis ...

  8. 【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)

    原文:http://blog.csdn.net/zhang197093/article/details/78143687?locationNum=6&fps=1 --------------- ...

  9. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

随机推荐

  1. [PHP] time_wait与长连接短连接

    服务端上查看tcp连接的建立情况,直接使用netstat命令来统计,看到了很多的time_wait状态的连接.这些状态是tcp连接中主动关闭的一方会出现的状态.该服务器是nginx的webserver ...

  2. Python xlwt模块写Excel问题集合

    1.数字转换成汉字 数据库查询返回结果为多元组,在写入Excel需要判断,数据库查询结果是否为数字,为数字的话需要将其转换成对应的汉字,此时元组不可修改,所以需要将返回结果修改成列表.实现可以在数据库 ...

  3. Mybatis逆向工程中的 mybatis-generator:generate 代码生成器的使用

    使用逆向工程可以根据数据库的表名字生成pojo层(实体类),mapper层(dao层,直接与底层的XML中映射相关),XML(映射执SQL语句) 下面请看具体生成步骤 1. 点击generatorCo ...

  4. 201871010111-刘佳华《面向对象程序设计(java)》第七周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第七周学习总结 实验时间 2019-10-11 1.实验目的与要求 1) 掌握四种访问权限修饰符的使用特点: (1)进一步理 ...

  5. lua 5 流程控制 if

    条件判断中,0 表示 true,只有 nil 才是 false if(0) then -- 可以没有括号 print("0 为 true") elseif 1 then print ...

  6. GitHub官网基本介绍

    1.当我们进入官网后会出现登陆的界面,这里我一一来解释大概的意思根据图中顺序来解释(1)是输入用户.邮箱.密码的地方.(2)是当你注册好了之后或者已注册之后点击这里跳转到登陆的界面.(3)是当你第一次 ...

  7. 10.12 csp-s模拟测试70 木板+打扫卫生+骆驼

    T1 木板 求$[\sqrt{n},n)$间有多少个数的平方是n的倍数 通过打表可以发现(我没带脑子我看不出来),符合条件的数构成一个等差数列,公差为首项 而首项就是将n质因数分解后每个质因数出现次数 ...

  8. 计算机基础 ---- 编码(er)

    1.字符集与编码 字符集:字符组成的集合,汉字,字母,符号被收录到标准的字符集合 编码:规定每个字符使用一个字节还是多个字节存储,那些字节来存储的规定 术语:字符编码(character encodi ...

  9. 我的周记12——"站在现在看前人对未来的预测,很有意思"

    万里风云三尺剑,一庭花草半床书 聊聊最近很火的5G B站有个up主  老师好我叫何同学  优秀啊,点赞. 他做了一个5G测速的视频火啦 视频链接:https://www.bilibili.com/vi ...

  10. Springboot如何打包部署项目

    原文地址 目录 前言 1. 导入插件 2.idea中快速打包 3.java –jar运行项目 4.访问项目 5.发布到服务器 前言 用心写好每一篇文章,真心对待每一个读者 文章首发地址: www.ja ...