点对点通信

点对点通信点对点通信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-所读取实际长度<预设长度

用途:

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

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

(0)
上一篇 2022年7月1日 下午3:00
下一篇 2022年7月1日 下午3:00


相关推荐

  • STM32 RT-Thread Nano(3)移植控制台与Finsh

    STM32 RT-Thread Nano(3)移植控制台与Finsh 本文介绍如何基于KeilMDK移植RT-Thread的控制台/Finsh。这样有利于开发过程中的调试,进行输入输出控制。开发平台:KeilMDK5.24硬件平台:XNUCLEO-F103RB 移植系统:RT-ThreadNanoV3.1.3 在Nano上添加UART控制台在RT-ThreadNano上添加UART控制台打印…

    2022年5月20日
    45
  • JAVA XML转对象 对象转XML

    JAVA XML转对象 对象转XML在网上看了许多XML跟Obj互相转换的Demo,但是都很复杂,现在推荐一个极度简单好理解的XML和Obj互转的例子:JacksonXML,只需要简单的几个注解就能完成XML和Obj的相互转换假设有如下xml报文:<?xmlversion=”1.0″encoding=”utf-8″?><msgbody><StringList>&…

    2022年7月21日
    17
  • Linux之shell编程的shell工具

    Linux之shell编程的shell工具一 shell 工具 Linux 在其内部集成了大量的工具 其中有四个工具对于 shell 编程具有很大的帮助 他们分别是 1 cut 工具 2 sed 工具 3 awk 工具 4 sort 工具 二 cut 工具 cut 工具是从文件的每一行剪切字节 字符和字段并将这些输出 cut 选项参数 filename 选项参数 1 f 列号 提取第几列 2 d 分隔符 按照指定分隔符分割列 3 c 指定具体的字符三 sed 工具 ed 是一种流编辑器 它一次处理一行内容 处理时 把当前处理的行存储在临时缓冲区中 称

    2026年3月17日
    1
  • javaweb实现分页_javaweb分页功能的代码

    javaweb实现分页_javaweb分页功能的代码首先我们要清楚java分页的思路第一我们要明白前端页面需要向java后台传递当前页码数以及每页显示多少条数据第二java后台代码需要向前端页面传递每页显示的数据,以及总条数以及总页数代码如下:首先我们要创建一个分页类用来存储数据publicclassPageObjectimplementsSerializable{privatestaticfinallongserialVersi…

    2026年4月16日
    10
  • c语言实现大数运算_c语言标准库教程

    c语言实现大数运算_c语言标准库教程前言:通过前面的3篇文章我们已经实现了大数的四则运算,本篇博客我们会把这是几个个方法做成一个库文件,可以供自己日后使用。细心的读者可能意到了,每个程序都引用了big.h但是都被注释掉了。big.h就是头文件只要将函数的声明放到该文件中,然后在其它程序中引用该文件就可以使用大数运算的方法。重复的代码我就不再写了,其实有了算法你们自己就可以实现,所以我就简单的说几句。文件命名:头文件:b

    2022年10月7日
    5
  • Cursor AI编辑器深度解析:15个核心功能实战应用指南

    Cursor AI编辑器深度解析:15个核心功能实战应用指南

    2026年3月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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