Linux进程间通信方式之socket使用实例

TCP/IP协议族包括运输层、网络层、链路层,而socket所在位置如图,Socket是应用层与TCP/IP协议族通信的中间软件抽象层。

下面是网络socket通信的基本流程:

在这里插入图片描述

socket函数

int socket(int domain, int type, int protocol);

socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符,它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。创建socket的时候,也可以指定不同的参数创建不同的socket描述符,socket函数的三个参数
分别为:
domain:即协议域,又称为协议族(family)。常用的协议族有AF_INET(ipv4网络)、AF_INET6(ipv6网络)、AF_LOCAL(本地通信)(或称AF_UNIX,Unix域socket)等等。

type:指定socket类型。常用的socket类型有,
SOCK_STREAM(TCP):流套接字(在某些方面类似域标准的输入/输出流)提供的是一个有序,可靠,双向字节流的连接
SOCK_DGRAM(UDP):数据包套接字不建立和维持一个连接。它对可以发送的数据包的长度有限制。数据报作为一个单独的网络消息被传输,它可能会丢失,复制或乱序到达
SOCK_RAW、SOCK_PACKET等等。
protocol:是指定协议。常用的协议有,IPPROTO_TCP(TCP)、IPPTOTO_UDP(UDP)、IPPROTO_SCTP(STCP)、IPPROTO_TIPC(TIPC)等,当protocol为0时,会自动选择type类型对应的默认协议。

bind()函数

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。

addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同,但最终都会强制转换后赋值给sockaddr这种类型的指针传给内核。

addrlen:对应的是地址的长度。

listen()函数

socket()函数创建的socket默认是一个主动类型的,如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,该函数socket变为被动类型的,等待客户的连接请求。

int listen(int sockfd, int backlog);

sockefd: socket()系统调用创建的要监听的socket描述字;

backlog: 相应socket可以在内核里排队的最大连接个数;

accept()函数

TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定socket地址了。服务器之后就会调用accpet()接受来自客户端的连接请求,这个函数默认是一个阻塞函数,这也意味着如果没有客户端连接服务器的话该程序将一直阻塞着不会返回,直到有一个客户端连过来为止。一旦客户端调用connect()函数就会触发服务器的accept()返回,这时整个TCP链接就建立好
了。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd: 服务器开始调用socket()函数生成的,称为监听socket描述字;

*addr: 用于返回客户端的协议地址,这个地址里包含有客户端的IP和端口信息等;

addrlen: 返回客户端协议地址的长度;

accept函数的返回值是由内核自动生成的一个全新的描述字(fd),代表与返回客户的TCP连接。如果想发送数据给该客户端,则我们可以调用write()等函数往该fd里写内容即可;而如果想从该客户端读内容则调用read()等函数从该fd里读数据即可。

connect(函数)

TCP客户端程序调用socket()创建socket fd之后,就可以调用connect()函数来连接服务器。

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd: 客户端的socket()创建的描述字;
addr: 要连接的服务器的socket地址信息,这里面包含有服务器的IP地址和端口等信息;
addrlen: socket地址的长度;

 服务端:
//s_unix.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h> 
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main(void)
{
  socklen_t clt_addr_len;
  int listen_fd;
  int com_fd;
  int ret;
  int i;
  static char recv_buf[1024]; 
  int len;
  struct sockaddr_un clt_addr;
  struct sockaddr_un srv_addr;
  listen_fd=socket(PF_UNIX,SOCK_STREAM,0);//创建socket文件描述符,
  if(listen_fd<0)
  {
    perror("cannot create communication socket");
    return 1;
  } 
  //set server addr_param
  srv_addr.sun_family=AF_UNIX;
  strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);
  unlink(UNIX_DOMAIN);
  //bind sockfd & addr
  ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
  if(ret==-1)
  {
    perror("cannot bind server socket");
    close(listen_fd);
    unlink(UNIX_DOMAIN);
    return 1;
  }
  //listen sockfd 
  ret=listen(listen_fd,1);
  if(ret==-1)
  {
    perror("cannot listen the client connect request");
    close(listen_fd);
    unlink(UNIX_DOMAIN);
    return 1;
  }
  //have connect request use accept
  len=sizeof(clt_addr);
  com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
  if(com_fd<0)
  {
    perror("cannot accept client connect request");
    close(listen_fd);
    unlink(UNIX_DOMAIN);
    return 1;
  }
  //read and printf sent client info
  printf("/n=====info=====/n");
  for(i=0;i<4;i++)
  {
    memset(recv_buf,0,1024);
    int num=read(com_fd,recv_buf,sizeof(recv_buf));
    printf("Message from client (%d)) :%s/n",num,recv_buf); 
  }
  close(com_fd);
  close(listen_fd);
  unlink(UNIX_DOMAIN);
  return 0; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/427595.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DevOps学习 | 如何应对IT服务交付中的问题?

目录 前言 DevOps是什么&#xff1f; DevOps发展历程 DevOps与微服务、容器的关系 书本推荐 前言 作为一个热门的概念&#xff0c;DevOps这个名词在程序员社区里频频出现&#xff0c;备受技术大佬们的追捧。甚至网络上有了“南无DevOps”的戏言&#xff08;南无在梵语的意…

MySQL面试题【全面】

基础内容 1、MySQL的架构分层 &#xff08;1&#xff09;Serve层&#xff1a;负责建立连接、分析和执行 SQL。 MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包括连接器&#xff0c;查询缓存、解析器、预处理器、优化器、执行器等。另外&#xff0c;所有的内置函数&…

解析 openGauss 的 AutoVacuum 机制及优化策略

前言 在 openGauss 数据库中&#xff0c;AutoVacuum 机制是一个关键的自动化功能&#xff0c;用于管理表的空间和性能。AutoVacuum 通过定期清理过时数据和更新统计信息&#xff0c;帮助数据库管理员维护数据库的性能和稳定性。 为什么需要 AutoVacuum&#xff1f; 了解AutoV…

SOCKS55代理 VS Http代理,如何选择?

在使用IPFoxy全球代理时&#xff0c;选择 SOCKS55代理还是HTTP代理&#xff1f;IPFoxy代理可以SOCKS55、Http协议自主切换&#xff0c;但要怎么选择&#xff1f;为解决这个问题&#xff0c;得充分了解两种代理的工作原理和配置情况。 在这篇文章中&#xff0c;我们会简要介绍 …

第15届蓝桥STEMA测评真题剖析-2024年1月28日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第173讲。 第15届蓝桥第4次STEMA测评&#xff0c;这是2024年1月28日举办的STEMA&#xff0c;比赛仍然采取线上形式。这…

羊大师揭秘羊奶与健康,美味的保健佳品

羊大师揭秘羊奶与健康&#xff0c;美味的保健佳品 羊奶确实是一种美味且健康的保健佳品&#xff0c;其独特的营养成分和风味使其成为许多人的健康选择。以下是一些羊奶与健康的关系&#xff1a; 营养丰富&#xff1a;羊奶含有丰富的蛋白质、脂肪、矿物质和维生素&#xff0c;…

【latex过长或过短】 表格大小调整 解决方案

文章目录 1、表格过短 1.2 问题描述1.2 解决方案 2、表格过长&#xff0c;显示信息不全 2.1 问题描述2.2 解决方案 1、表格过短 1.2 问题描述 表格占整个页面的宽度较小&#xff0c;如下图&#xff1a; Latex源码如下&#xff1a;\begin{table*} \caption{short} \label{t1} …

OpenCompass 大模型评测介绍和实战

为什么要进行评测&#xff1f; 大模型的能力 模型评测对各个人的影响 如何评测大语言模型 客观评测 主观评测 prompt工程 平台结构 流水线设计 大模型评测对比 多模态探索 垂直领域&#xff08;法律&#xff09; 垂直领域&#xff08;医疗&#xff09; 大模型评测领…

Python 语句(二)【循环语句】

循环语句允许执行一个语句或语句组多次&#xff0c;其程序流程图如下&#xff1a; 在python中有三种循环方式&#xff1a; while 循环 当判断条件为 true 时执行循环体&#xff0c;否则退出循环体。for 循环 重复执行语句嵌套循环 &#xff08;在while循环体中嵌套for循环&…

Java 打包 SpringBoot 项目报错

Java 打包 SpringBoot 项目报错 问题重现 Please refer to xxxx for the individual test results. Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream. 解决问题 在 pom.xml 的 <properties> 中添加项目代码 <s…

Python处理表格数据库之Agate使用详解

概要 您是否有时觉得在处理表格数据时感到不知所措? 也许你在处理一个大型 CSV 文件,遇到了各种数据不一致的问题,或者需要验证数据,确保其准确无误才能进行下一步分析。 传统的数据分析库或许功能强大,但学习曲线陡峭,用起来有点杀鸡用牛刀的感觉。 这时,有一个更…

2024六大创业营销趋势,普通人创业新风向!

2024年越来越多的人选择创业&#xff0c;从龙年春节前后&#xff0c;创投圈就开始探讨关于2024的创业新风向&#xff0c;从各个热点&#xff0c;各大品牌&#xff0c;春晚等等方面洞察2024创业趋势&#xff0c;以下总结的6大创业营销趋势&#xff0c;跟着大品牌押宝&#xff0c…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:焦点控制)

自定义组件的走焦效果&#xff0c;可设置组件是否走焦和具体的走焦顺序&#xff0c;tab键或者方向键切换焦点。 说明&#xff1a;从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 focusable focusable(value: boolean) 设…

一个iOS应用是如何启动以及如何优化

一、应用启动流程 1、主要阶段&#xff1a; 分为两个阶段&#xff0c;pre-main阶段和main()阶段。程序启动到main函数执行前是pre-main阶段&#xff1b;在执行main函数后&#xff0c;调用AppDelegate中的-application:didFinishLaunchingWithOptions:方法完成初始化&#xff…

uniapp和vue项目配置多语言,实现前端切换语言

在uniapp中配置多语言功能&#xff0c;实现前端切换语言&#xff0c;可以按照以下步骤进行&#xff1a; 1. 创建语言包 首先&#xff0c;创建一个名为 lang 的目录&#xff0c;并在该目录下为每种支持的语言创建对应的JSON或JS文件。例如&#xff1a; lang/en.js&#xff08…

微信小程序屏蔽控制台黄色提示信息

我们很多时候 一个小程序 啥都没有 终端就一直报一些黄色的警告 可以打开项目的 project.config.json 找一下setting 下面有没有 checkSiteMap 字段 如果没有加一个 如果有 直接将值改为 false 这样 再运行 就不会有这个黄色的提示信息了

K8S集群中如何删除并重新部署pod

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Linux CentOS使用Docker部署Apache Superset并实现远程分析数据

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

洛谷 B3620 x 进制转 10 进制

题目描述 给一个小整数 x 和一个 x 进制的数 S。将 S 转为 10 进制数。对于超过十进制的数码&#xff0c;用 A&#xff0c;B&#xff0c;…… 表示。 输入格式 第一行一个整数 x; 第二行一个字符串 S。 输出格式 输出仅包含一个整数&#xff0c;表示答案。 输入输出样例…

打造专属投屏体验:Windows系统投屏到iOS系统

想要将电脑投屏共享给同事或朋友&#xff0c;又担心隐私内容泄露&#xff1f;来来来&#xff0c;这里有妙招&#xff01; AirDroid Cast网页版让电脑投屏变得挑剔&#xff0c;只展示你允许共享的内容。会议资料、个人照片、敏感文件&#xff0c;都将得到严格的筛选&#xff0c;…
最新文章