首页 > 其他分享 >本地套接字 [补档-2023-07-24]

本地套接字 [补档-2023-07-24]

时间:2024-01-13 18:23:37浏览次数:28  
标签:24 serv 07 补档 UNIX 接字 include data sizeof

本地套接字

7-1简介

​ 在Linux系统下,可以使用本地套接字(Unix域套接字)进行进程间通信。本地套接字是一种特殊类型的套接字,用于在同一主机上的进程之间进行通信。

7-2 创建本地套接字服务器的流程

​ 可以使用TCP或UDP的方式来实现通信,使用TCP就得遵循TCP的流程,UDP就要遵循UDP的流程。

7-2-1使用TCP的本地套接字服务器流程

第一步:使用socket创建一个套接字,并且第一个参数为AF_UNIX,第二个为SOCK_STREAM (TCP)。

第二步:使用bind进行本地地址绑定,但是结构体要是struct sockaddr_un并且成员sun_family也要是AF_UNIX。而且要创建一个变量(详见代码)。然后bind中要使用struct sockaddr_un &进行强转

第三步:使用listen函数监听套接字。

第四步:使用accept函数获得新连接。

第五步:对接收到的数据进行读写或者其他操作。

第六步:如果不需要停下来记得关闭acdept和socket创建的两个文件描述符。

7-2-2使用TCP的本地套接字客户端流程

第一步:创建套接字,并且第一个参数为AF_UNIX,第二位SOCK_STREAM (TCP)。

第二步:绑定本地地址。(不是必须的, 若无显示绑定会进行隐式绑定,但服务器不知道谁连接了)。

第三步:调用connect函数进行连接。

第四步:通信。

第五步:关闭第一步创建的描述符。

7-3 本地套接字服务端代码实例

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/un.h>

 
int main()

{

  //创建套接字,记得使用AF_UNIX

  int lfd = socket(AF_UNIX, SOCK_STREAM, 0);

  if (lfd < 0) {

​    perror("创建套接字失败!");

​    exit(0);

  }

 

  struct sockaddr_un serv;//本地地址

  struct sockaddr_un clie;//客户端地址

  serv.sun_family = AF_UNIX;//记得使用UNIX

  //创建一个变量,之后客户端需要访问这个变量才能进行本地通信

  strcpy(serv.sun_path, "./server.sock");

 

  //绑定

  int ret = bind(lfd, (struct sockaddr*)&serv, sizeof(serv));

  if (ret < 0) {

​    perror("bind error");

​    exit(0);

  }

 

  //监听

  ret = listen(lfd, 10);

​    if (ret < 0) {

​      perror("listen error");

​      exit(0);

​    }

 

  int n;

  char data[100];

  char serv_data[100] = "server susser!";

  //建立连接

  int len = sizeof(clie);

  int cfd = accept(lfd, (struct sockaddr*)&clie, &len);

 

  while (1) {

​    memset(data, 0x00, sizeof(data));

​    n = recv(cfd, data, sizeof(data), 0);

​    if (n < 0) {

​      perror("recv error!!!");

​    }

 

​    if (send(cfd, serv_data, sizeof(serv_data), 0) == -1) {

​      perror("send error!!!");

​    }

  

  }
 

  close(lfd);

​    return 0;

}

7-4 本地套接字客户端代码实例

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/un.h>
 

int main()

{

  //创建套接字,使用AF_UNIX

  int cfd = socket(AF_UNIX,SOCK_STREAM,0);

 

  //绑定

  struct sockaddr_un clie;

  bzero(&clie, sizeof(clie));//类似于memset

  clie.sun_family = AF_UNIX;//同样使用AF_UNIX

  strcpy(clie.sun_path, "./client.sock");//创建变量

  int ret = bind(cfd, (struct sockaddr*)&clie, sizeof(clie));//绑定

  if (ret < 0)

  {

​     perror("bind error");

​     return -1;

  }

  int data[100];

  int n;

 

  //监听

  ret = listen(cfd, 123);

  if (ret < 0) {

​     perror("error");

​     exit(0);

  }

 

  struct sockaddr_un serv;//用于记录服务端地址

  bzero(&serv, sizeof(serv));//类似于memset

  serv.sun_family = AF_UNIX; //同样使用AF_UNIX

  strcpy(serv.sun_path,"./server.sock");//创建变量

 

  //连接

  ret = connect(cfd,(struct sockaddr *)&serv,sizeof(serv));

  if (ret < 0) {

​     perror("error");

​     exit(0);

  }

 

  while (1) {

​     memser(data,0x00,sizeof(data));//初始化

​     printf("请输入你要发送的数据\n");

​     scanf("%s", &data);

 

​     if (send(cfd, data, sizeof(data), 0) == -1) {

​       printf("发送数据失败\n");

​       return -1;

​     }

 

​     n = recv(cfd,data,sizeof(data),0);

​     printf("%s\n",data);

  }

  

  close(cfd);

}

标签:24,serv,07,补档,UNIX,接字,include,data,sizeof
From: https://www.cnblogs.com/xiaobai1523/p/17962703

相关文章

  • Libevent [补档-2023-08-29]
    libevent的使用8-1安装​自己百度一下,安装它不是特别难,加油!!!8-2libevent介绍​它是一个开源库,用于处理网络和定时器等等事件。它提供了跨平台的API,能够在不同的操作系统上实现高性能,可扩展的世界去的编程。​1.事件驱动:libevent使用事件驱动模型,通过监听事件的......
  • 多路io复用Select [补档-2023-07-16]
    select2.1简介​select函数可以用于实现高效的多路复用I/O,同时处理多个文件描述符的事件,包括监听可读、可写和异常条件,具有阻塞和非阻塞模式,并可以设置超时时间。这使得程序能够高效地处理并发任务,提高性能和响应性。2.2select函数​头文件:#include<sys/select>......
  • 多路io复用pool [补档-2023-07-19]
    多路IO-poll3.1简介​poll的机制与select类似,他们都是让内核在以线性的方法对文件描述符集合进行检测,根据描述符的状态进行具体的操作。并且poll和select在检测描述符集合时,会在检测的过程中频繁的进行用户区和内核区的拷贝,随着文件描述符集合中的数量增大,开销也随之增大,效......
  • 多路io复用epoll [补档-2023-07-20]
    多路io-epoll4-1简介​它是linux中内核实现io多路/转接复用的一个实现。(epoll不可跨平台,只能用于Linux)io多路转接是指在同一个操作里,同时监听多个输入输出源,在其中一个或多个输入输出源可用时范慧慧这个源,然后对其进行操作。​epoll采用红黑树来管理待检测的集合,而p......
  • UDP通信 [补档-2023-07-22]
    UDP通信6-1简介​UDP通信是面向无链接的,不稳定,不可靠,不安全的一种通信方式。TCP在通信前发送方会向接收方进行三次握手链接,然后确认双方链接后才会进行数据传输,最后四次挥手保证链接关闭。而UDP不会三次握手四次挥手,它会直接向发送方发送数据,无论接收方是否会收到,所以UDP更......
  • 2024年·用50种语言对你说“Hello,World!”
    2024年·用50种语言对你说“Hello,World!” 动力节点​已认证账号​关注 14人赞同了该文章这是一个计算机世界的编程时光之旅。对很多人来说,每当学习一门新的编程语言,写下的第一行代码可能都是“Hello,World!“。因此,”Hello,World!"已经成为一段......
  • socket编程 [补档-2023-07-10]
    Linux网络编程1.socket编程socket是一种通信机制,用于在网络中不同计算机之间进行数据传输,当然也可用用于进程间通信。在linux中,有文件描述符这么个东西,我们可以通过socket函数创建一个网络连接,socket的返回值为一个文件描述符,我们拿到这个文件描述符就可以像操作普通io文件那样......
  • P3243 [HNOI2015] 菜肴制作 题解
    前言今天考试考到这道题,挂惨了。题意有\(n\)道菜肴,编号为\(1\simn\)。有\(m\)个条件,形如\((i,j)\),表示菜肴\(i\)必须在菜肴\(j\)之前制作。需求出一个菜肴的制作顺序,满足:在满足所有限制的前提下,\(1\)号菜肴尽量优先制作。在满足所有限制,\(1\)号菜肴尽量优......
  • P9007 [入门赛 #9] 最澄澈的空与海 (Hard Version) 题解
    Updon2023.10.1408:21:修改了推式子和题意的一些小错误。前言一道恐怖的绿题。显然我认为应该是蓝题。(不过在这篇题解写到一半的时候升蓝了,感谢@StudyingFather。)名字挺好的。题意给定\(n\),求出满足以下条件的三元组\((x,y,z)\)的组数:\(x\ge0,z\ge1\)。\(......
  • Linux进程间通信 [补档-2023-07-27]
    Linux进程间通信10-1简介​在Linux下,进程之间相互独立,每个进程都有自己不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问。如果非要交换数据则必须通过内核,在内核中开辟一块缓冲区。假设有两个进程AB,他们之间想......