当前位置: 首页 > news >正文

Linux网络编程---本地套接字

1.概述

本地套接字
    1:作用:本地的进程间通信
    2.有关系的进程间通信
    3.没有关系的进程间的通信
本地套结字实现流程和网络套结字实现相似,一般采用tcp
 

 二.通信流程

本地套结字通信的流程:1.服务器端:1.1 int fd = socket(AF_UNIX/AF_LOCAL,SOCKET_STREAM,0)1.2 监听的套结字需要绑定本地的套结字文件struct sockaddr_un addr;绑定成功后指定的sun_path中的套结字文件会自动生成bind(fd,addr,len);1.3 监听listen(fd,100);1.4等待并接收连接请求struct sockaddr_un cliaddr;int cfd = accept(fd,&cliaddr,&len)1.5通信recv send1.6关闭客户端1. int fd = socket(AF_LOCAL,SOCKET_STREAM,0)2. 绑定成功后指定的sun_path中的套结字文件会自动生成struct sockaddr_un addr;bind(fd,addr,len)3.连接struct sockaddr_un serveraddr;connect(fd,&serveraddr,len);4.通信5.关闭

三.实例代码实现

3.1 server

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>#include <sys/un.h>int main()
{unlink("server.sock");//解决报错:bind: Address already in useint sockfd =  socket(AF_LOCAL,SOCK_STREAM,0);if(sockfd == -1){perror("socket");exit(-1);}struct sockaddr_un server;server.sun_family = AF_LOCAL;strcpy(server.sun_path,"server.sock");if(bind(sockfd,(const struct sockaddr*)&server,sizeof(server)) == -1){perror("bind");exit(-1);}if(listen(sockfd, 100) == -1){perror("listen");exit(-1);}struct sockaddr_un client;int len = sizeof(client);int client_fd = accept(sockfd,(struct sockaddr*)&client,&len);if(client_fd == -1){perror("accept");exit(-1);}char recvbuff[1024] = {0};char *server_data = "i am server";while(1){memset(recvbuff,0,sizeof(recvbuff));len = recv(client_fd,recvbuff,sizeof(recvbuff),0);if(len == -1){perror("recv");break;}else if(len == 0){printf("客户端断开连接\n");}else if(len > 0){printf("recv client data : %s\n",recvbuff);}send(client_fd,server_data,strlen(server_data),0);}close(sockfd);close(client_fd);return 0;
}

3.2 client

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/un.h>int main()
{unlink("client.sock"); //解决报错:bind: Address already in useint sockfd =  socket(AF_LOCAL,SOCK_STREAM,0);if(sockfd == -1){perror("socket");exit(-1);}struct sockaddr_un server;server.sun_family = AF_LOCAL;strcpy(server.sun_path,"client.sock");if(bind(sockfd,(const struct sockaddr*)&server,sizeof(server)) == -1){perror("bind");exit(-1);}struct sockaddr_un client;client.sun_family = AF_LOCAL;memcpy(client.sun_path,"server.sock",sizeof("server.sock"));int len = sizeof(client);int ret = connect(sockfd,(const struct sockaddr*)&client,len);if(ret == -1){perror("connect");exit(-1);}int num = 0;char buff[1024];while(1){memset(buff,0,sizeof(buff));printf("client say: %s\n",buff);sprintf(buff,"hello i am clinet------%d\n",num++);len = send(sockfd,buff,strlen(buff)+1,0);if(len == -1){perror("send");break;}sleep(1);memset(buff,0,sizeof(buff));len = recv(sockfd,buff,sizeof(buff),0);if(len == -1){perror("recv");exit(-1);}else if(len == 0){printf("服务端断开连接\n");}else if(len > 0){printf("recv server data : %s\n",buff);}}close(sockfd);return 0;
}

http://www.lryc.cn/news/500400.html

相关文章:

  • 数据结构之四:堆和二叉树
  • 【论文阅读】国际开源发展经验及其对我国开源创新体系建设的启示
  • redis击穿,穿透,雪崩以及解决方案
  • 时频转换 | Matlab格拉姆角和场Gramian angular summation field一维数据转二维图像方法
  • qt QCryptographicHash详解
  • 亚马逊云科技大语言模型加速OCR应用场景发展
  • 什么是分库?分表?分库分表?
  • QT 中 sqlite 数据库使用
  • 不一样的CSS(4)--icon图标系列之svg
  • Level DB --- Cache
  • 学在西电录播课使用python下载,通过解析m3u8协议、多线程下载ts视频块以及ffmpeg合并
  • Springboot3介绍
  • Oracle 11G DataGuard GAP 修复过程(通过主库scn增备恢复)
  • WLAN AutoConfig服务假死?重启服务恢复网络连接!
  • 【linux】(30)shell-条件判断
  • docker安装启动问题解决排查
  • 《MySQL 查询进阶:复杂查询语句的魅力》
  • OpenHarmony-3.HDF框架(2)
  • 人大金仓(KingBaseEs)数据库操作手册
  • Flink+Paimon实时数据湖仓实践分享
  • w~深度学习~合集1
  • KVM 虚拟化
  • MONI后台管理系统-数据库设计
  • Rigol DP711自动控制--SCPI命令
  • 总结FastDFS的面试题
  • Fiddler 5.21.0 使用指南:过滤浏览器HTTP(S)流量下(四)
  • 【踩坑】pip安装依赖卡在Installing build dependencies ...
  • 【WRF-Urban】SLUCM新增空间分布城市冠层参数及人为热排放AHF代码详解(下)
  • 云桌面:云计算桌面
  • WPF+LibVLC开发播放器-音量控制和倍速控制