linux 本地套接字通信
本地套接字通信
利用本地套接字,也可以进程间通信。
本地套接字和有名管道一样都利用伪文件
管道的文件类型是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 本地套接字通信的更多相关文章
- Linux本地套接字(Unix域套接字)----SOCK_DGRAM方式
目录 简述 创建服务端代码: 创建客户端代码 接收函数封装 发送封装 服务端测试main函数 客户端测试main函数 编译运行结果 简述 这里介绍一下Linux进程间通信的socket方式---Loc ...
- IPC——流套接字通信
Linux进程间通信——使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进 ...
- Linux/UNIX套接字连接
套接字连接 套接字是一种通信机子.凭借这样的机制.客户/server系统的开发工作既能够在本地单机上进行.也能够夸网络进行. 套接字的创建和使用与管道是有差别的.由于套接字明白地将客户和server区 ...
- Linux编程---套接字
网络相关的东西差点儿都是建立在套接字之上.所以这个内容对于程序猿来说还是蛮重要的啊. 事实上套接字也就是一个特殊的设备文件而已,我始终不能明确为什么要叫套接字.这么个奇怪的名字.只是还是就这样算了吧. ...
- 网络编程 - 1.简单的套接字通信/2.加上通信循环/3.bug修复/4.加上链接循环/5.模拟ssh远程执行命令
1.简单的套接字通信 服务端 ''' 服务端 接电话 客户端 打电话 1.先启动服务端 2.服务端有两种套接字 1.phone 用来干接收链接的 2.conn 用来干收发消息的 ''' import ...
- linux netlink套接字学习资料
理论: http://blog.csdn.net/unbutun/article/details/3394061 进一步深入: http://edsionte.com/techblog/archive ...
- Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象
一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字 server.bind() #把地址绑定到套接字,网络地址加端口 server.lis ...
- 【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)
原文:http://blog.csdn.net/zhang197093/article/details/78143687?locationNum=6&fps=1 --------------- ...
- 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法
TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...
随机推荐
- C语言中变量和函数的作用域和链接属性
C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...
- C++学习03_对象
1.类 类决定了一个对象具有什么样的属性功能. class MyFirstClass { }; //跟C++结构情况相似 //类的第一个字母采用大写是一种习惯的上的标准. //与C++结构情况类似 类 ...
- Vue 动态粒子特效(vue-particles)
图上那些类似于星座图的点和线 是由vue-particles生成的,不仅自己动,而且能与用户鼠标事件产生互动. 是非常炫的一种动态特效 可以在Vue项目中使用,需要安装第三方依赖 使用步骤 1. 安装 ...
- pdfium 例子
#include <stdio.h> #include <fpdfview.h> int main(int argc, char** argv) { FPDF_InitLibr ...
- 汇编和C/C++的混合编程方式
常用的有三种方式: 在C/C++代码中嵌入汇编指令 汇编调用C/C++ C/C++中调用汇编 实例一: 在C中嵌入汇编: void string_copy(char *dst,const char * ...
- day8_对象的交互
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/14 15:07 # @Author : 大坏男孩 # @File : d ...
- LINUX下查看点云图————point cloud(.ply .vtk .pcd)
首先,你要确定点云的格式:.pcd(.vtk) 还是 .ply 如果是.pcd(.vtk),那么可以用pcl工具查看: 1.安装pcl,官网链接点击打开链接 sudo add-apt-reposito ...
- QBXT模拟赛1
总结 期望得分:\(100 + 80 + 10 = 190\) 实际得分:\(90 + 80 + 10 = 180\) 这是在清北的第一场考试,也是在清北考的最高的一次了吧..本来以为能拿\(190\ ...
- MySQL实战45讲学习笔记:第四十二讲
一.本节概述 在 MySQL 里面,grant 语句是用来给用户赋权的.不知道你有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语 ...
- Java List<T> 去重
1.List<T>,是个泛型,实际业务里,它经常是一个bean,例如Person类,里面有age.name等属性. 2.如果List<Person> ps 有重复的数据,我们 ...