点对点通信

点对点通信点对点通信client/server

大家好,又见面了,我是你们的朋友全栈君。

首部


点对点通信

Client / Server

通信模型

服务端

1. 创建通行节点-`socket`
2. 绑定-`bind`
3. 监听-`listen`
4. 接受连接-`accept`
5. 发送/接受数据- `write/read `或 `send/recv`
6. 断开连接,-`close`

接口设计

2021-01-19_11-38

客户端

1. 创建通信节点-`socket`
2. 连接服务器-`connect`
3. 发送/接受数据- `write/read `或 `send/recv`
4. 断开连接,-`close`

接口设计

2021-01-18_19-18


API-linux

socket

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

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

功能:

  • 创建一个通行端点

入口:

  • domain -协议域
   AF_UNIX AF_LOCAL     Synonym for AF_UNIX	//本地通信协议
   AF_INET      IPv4 Internet protocols  
   AF_INET6     IPv6 Internet protocols  
  • type -套接字类型
   SOCK_STREAM     Provides sequenced, reliable, two-way, connection-based
                   byte  streams.  An out-of-band data transmission mecha‐
                   nism may be supported.
                   // 基于连接的有序可靠双向的字节流通信方式

   SOCK_DGRAM      Supports datagrams (connectionless, unreliable messages
                   of a fixed maximum length).
       			   // 无连接不可靠的有固定长度的数据报通信方式
  • protocol-通信协议
    • 默认值-0

返回值:

  • 成功-返回一个套接字描述符号
  • 失败- -1 设置errno

bind

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

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

函数功能:

  • 将套接字绑定到监听端口

入口:

  • sockfd-服务套接字描述符
  • addr-服务套接字内存地址
  • addrlen-服务套接字内存长度

出口:

  • 0-正常

listen

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int listen(int sockfd, int backlog);

功能:

  • 监听服务套接字

参数:

  • sockfd-服务套接字描述符
  • backlog-同时连接的最大个数

返回:

  • 0-正常

accept

   #include <sys/types.h>          /* See NOTES */
   #include <sys/socket.h>

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

功能:

  • 接受连接-(如:tcp三次握手)

参数:

  • sockfd-服务套接字描述符
  • addr-连接套接字的内存地址
  • addrlen-地址内存长度

返回:

  • 连接套接字的描述符 -1-错误

connect

   #include <sys/types.h>          /* See NOTES */
   #include <sys/socket.h>

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

功能:

  • 发起连接

参数:

  • socked-客户套接字描述符
  • addr-服务套接字的内存地址
  • addrlen-地址内存长度

返回:

  • 0-正常

注意

管道破裂

场景:

  • 通信双方在通信过程中,一方直接退出,另一方仍然向已退出一方,继续输送数据。

后果:

  • 未退出一方的操作系统,向该进程发送一个 SIGPIPE 信号
  • 该信号量默认关闭程序

解决方法:

  • 捕获该信号
  • 更改代码 – 管道的一端关闭时,不再向管道内写数据

TCP断开等待

场景:

  • 通信双方在通信过程中,一方主动断开后,立即重用

后果:

  • 显示address already in use

解决:

  • 等待1-分钟
  • 设置套接选项,允许立即重新适用地址与端口

无FIN-下线

场景:

  • 在连接双方通信过程中,无FIN结束报文,直接断开连接

后果:

  • read-所读取实际长度<预设长度

用途:

  • 可将实际长度与预设长度对比-判断对方是否在线
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154651.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mongodb 学习笔记 04 — 游标、索引「建议收藏」

    mongodb 学习笔记 04 — 游标、索引

  • 多尺度二维离散小波分解wavedec2

    多尺度二维离散小波分解wavedec2对X进行N尺度小波分解[C,S]=wavedec2(X,N,’wname’);clc,clearall,closeall;loadwoman;[c,s]=wavedec2(X,2,’db1′);%进行2尺度二维离散小波分解。分解小波函数-db1[cH1,cV1,cD1]=detcoef2(‘all’,c,s,1);%尺度1的所有方向的高频系数[cH2,cV2,c…

  • Odin Inspector 系列教程 — 初识 OdinWindow「建议收藏」

    Odin Inspector 系列教程 — 初识 OdinWindow「建议收藏」笔者以往在使用一些插件的时候经常会看上面这种多炫酷的插件操作界面,常常羡慕不已,如今有了Odin,自己也可以简简单单的实现这些炫酷的效果了,下面笔者就带大家初识OdinWindow。创建一个Window不积跬步无以至千里,我们先从最简单的创建一个Window开始,只需要自定义一类并继承OdinEditorWindow即可publiccl…

  • 四大桌面云显示协议解析

    四大桌面云显示协议解析

  • 华为verilog代码规范(wps初学者入门教程)

    对于初学者,可大致了解VerologHDL所提供的能力,掌握VerilogHDL语言的核心子集。1VerilogHDL语言具有:设计的行为特性、设计的数据流特性、设计的结构组成以及包括响应监控和设计验证方面的时延和波形产生机制。2如何描述自顶向下的设计思想:每个模块实现特定的功能,模块间可进行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最后通过由顶层模块调用子模块来实现整体功能。3三种建模方式3.1结构化描述方式结构化建模方式就是通过对电

  • 通用计算机的发展历程,中国计算机发展史

    通用计算机的发展历程,中国计算机发展史中国计算机发展史以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!1、第一代电子管计算机研制(1958-1964年)我国从1957年在中科院计算所开始研制通用数字电子计算机,1958年8月1日该机可以表演短程序运行,标志着我国第一台电子数字计算机诞生。机器在738厂开始少量生产,命名为103型计算机(即DJS-1型)。19…

    2022年10月19日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号