点对点通信

点对点通信点对点通信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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【转】Matlab axis用法

    【转】Matlab axis用法Matlabaxis用法转自:http://blog.sina.com.cn/s/blog_b26a90750101kxdx.htmlaxisoff;%去掉坐标轴axistight;%紧坐标轴axisequal;%等比坐标轴axis([-0.1,8.1,-1.1,1.1]);%坐标轴的显示范围%gca:gca,h=figur…

    2022年5月29日
    36
  • linux之fstab文件详解「建议收藏」

    linux之fstab文件详解「建议收藏」/etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less/etc/fstab来查看,如果要修改的话,则用命令vi/etc/fstab来修改。当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。下面我来介绍如何在此文件下填写信息。

    2025年8月9日
    3
  • charles进行弱网测试(app弱网测试怎么做)

    最近尝试用Charles模拟弱网做了下测试,初步记录一下,适用PC端和移动端(IOS/Android)1.以charles4.2版本为例,打开Proxy-&gt;ThrottleSettings2.出现下面的界面3.预设那里有Charles常用的网络设置模拟的数据,根据需要自己选择即可,从上到下网速依次提升4.习惯自己设置数据来模拟弱网的可以参考下面的数据来设置哦【弱网】上行:10   …

    2022年4月15日
    168
  • jenkins自定义构建参数_jenkins自动部署

    jenkins自定义构建参数_jenkins自动部署前言当我们的自动化项目越来越多的时候,在代码仓库会提交不同的分支来管理,在用jenkins来构建的时候,我们希望能通过参数化构建git仓库的分支。下载安装GitParameter插件系统管理-

    2022年7月28日
    18
  • 2021 pycharm激活码_通用破解码

    2021 pycharm激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    54
  • adb 命令大全_整理磁盘碎片的命令

    adb 命令大全_整理磁盘碎片的命令adb是什么?:adb的全称为AndroidDebugBridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具。adb的工作方式比较特殊,采用监听SocketTCP5554等端口的方式让IDE和Qemu通讯,默认情况下adb会daemon相关的网络端口,所以当我们运行Eclipse时adb进程就会自…

    2022年4月20日
    107

发表回复

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

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