linux send recv函数详解

2023-11-19

2009-05-10 21:55

int send( SOCKET s, const char FAR *buf, int len, int flags );

    不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

    该函数的第一个参数指定发送端套接字描述符;

    第二个参数指明一个存放应用程序要发送数据的缓冲区;

    第三个参数指明实际要发送的数据的字节数;

    第四个参数一般置0。

    这里只描述同步Socket的send函数的执行流程。当调用该函数时,

   (1)send先比较待发送数据的长度len和套接字s的发送缓冲的长度, 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;

   (2)如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len

   (3)如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完

   (4)如果len小于剩余 空间大小,send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。

   如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

   要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR)

注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

通过测试发现,异步socket的send函数在网络刚刚断开时还能发送返回相应的字节数,同时使用select检测也是可写的,但是过几秒钟之后,再send就会出错了,返回-1。select也不能检测出可写了。


2. recv函数

int recv( SOCKET s, char FAR *buf, int len, int flags);   

    不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符;

    第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;

    第三个参数指明buf的长度;

    第四个参数一般置0。

    这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,

    (1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,

    (2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),

    recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux send recv函数详解 的相关文章

  • 保护一个保存 MySQL 数据库的简单 Linux 服务器?

    这是一个初学者问题 但我浏览了该网站上的许多问题 但没有找到简单直接的答案 我正在设置一个运行 Ubuntu 的 Linux 服务器来存储 MySQL 数据库 该服务器尽可能安全非常重要 据我所知 我主要担心的是传入的 DoS DDoS 攻
  • 为什么我的 Java 代码执行 bash 命令不正确?

    我试图让我的 Java 程序与 Linux bash 交互 但出了问题 我有一个简单的可执行文件prog从中读取一个整数stdin并输出其平方 执行中 echo 5 prog 从 bash 本身打印正确答案25 in stdout但运行 i
  • 配置错误:无法链接到 boost_system

    我正在尝试在 Debian 上安装一个软件包 足球模拟器 2d 当我进入目录并运行时 configure 我得到以下信息 reza debian soccer rcssserver 15 0 1 configure checking for
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • Linux 中如何获取内存修改通知

    在Linux的用户空间程序中 我通过从堆中分配来获取一块内存 然后将指针分发给在其他线程中运行的许多其他组件来使用 当上述内存被修改时我想收到通知 我当然可以开发一个自定义用户空间解决方案 供其他组件在尝试修改内存时使用 我的情况的问题是这
  • 在 Linux 中使用仅限 CLI 的工具生成磁盘使用情况图/图表

    在这个问题中 https stackoverflow com questions 32230 tracking down where disk space has gone on linux有人询问如何在 Linux 中显示磁盘使用情况 我
  • 当模式在范围内时使用 sed 打印范围?

    我有一个充满查询的日志文件 我只想查看有错误的查询 日志条目类似于 path to file executing query QUERY SIZE ROWS MSG DURATION 我想打印所有这些东西 但只有当MSG 包含一些有趣的内容
  • 使用 Shell 脚本提供密码

    我已将客户端和服务器设置为无密码登录 就像无密码登录一样 通过将服务器的 RSA 密钥复制到所有客户端的 root ssh id rsa pub 来实现 但这是我手动完成的 我喜欢使用 shell 脚本自动执行此过程 并通过脚本向计算机提供
  • 使用openssl从服务器获取证书

    我正在尝试获取远程服务器的证书 然后可以将其添加到我的密钥库中并在我的 Java 应用程序中使用 一位高级开发人员 正在度假 告诉我我可以运行这个 openssl s client connect host host 9999 获取转储的原
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 每当调用 malloc/free 时输出到 stderr

    使用 Linux GCC C 每当调用 malloc free new delete 时 我想向 stderr 记录一些内容 我试图了解库的内存分配 因此我想在运行单元测试时生成此输出 我使用 valgrind 进行内存泄漏检测 但我找不到
  • 如何重命名共享库以避免同名冲突?

    我找到了一个图书馆 libjson http sourceforge net projects libjson 我正在尝试将其构建为共享库并在项目中使用 建造很简单 修复 Makefile 错误后 SHARED 1 make install
  • 在命令行上解密使用 PHP openssl_encrypt 制作的文件

    我有一个要加密的字符串 encryptThis Super Secret Text echo openssl encrypt encryptThis aes 128 cbc 1234 FALSE F68A9A229A516752 然后我通过
  • 使用无效命令进行 fork 会导致 valgrind 中的内存泄漏

    我有以下代码 它在分叉内执行无效命令 以下代码在 valgrind 中返回内存泄漏 include
  • 除了 iptables 之外还有数据包管理实用程序吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Linux 实用程序 它可以根据一组规则更改网络数据包的有效负载 理想情况下 我会使用
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些

随机推荐

  • Redis缓存详解 -- 转载

    Redis缓存详解 一 缓存穿透 二 缓存雪崩 三 缓存击穿 本篇为转载 只做码届搬运工 Thanks 一 缓存处理流程 前台请求 后台先从缓存中取数据 取到直接返回结果 取不到时从数据库中取 数据库取到更新缓存 并返回结果 数据库也没取到
  • 浏览器发器POST请求

    浏览器按F12或打开开发者工具 在console 控制台 标签页下输入 fetch new Request http localhost 8080 power font getToken method POST headers Conten
  • oracle同比计算

    计算同地区下 同比百分比 select 2020 area no area desc city no city desc area level key id CASE WHEN NVL SUM VAL 19 0 0 THEN 0 ELSE
  • word2vec损失函数

    未优化前损失函数 以CBOW为例 利用softmax层计算出字典V中每个词的概率 再构建交叉熵损失函数 负采样损失函数 直接对词典里的V个词计算相似度并归一化显然是极其耗时的 为此作者提出了层次Softmax和负采样两种损失层 负采样损失函
  • 【笔试】操作系统知识点整理

    一 操作系统概述 1 操作系统的主要功能 进程与处理机管理 作业和进程调度 进程控制和进程通信 存储管理 内存分配 地址映射 内存保护和内存扩充 设备管理 缓冲区管理 设备分配 设备驱动 设备无关性 文件管理 文件存储空间的管理 文件操作的
  • Eclipse 安装阿里巴巴代码规范插件的步骤

    2017年10月14日杭州云栖大会 Java代码规约扫描插件全球首发仪式正式启动 规范正式以插件形式公开走向业界 引领Java语言的规范之路 目前 插件已在云效公有云产品中集成 立即体验 云效 gt 公有云 gt 设置 gt 测试服务 gt
  • c++系列 —— 移动构造函数

    往期地址 c 系列一 c 的封装 c 系列二 c 的继承 c 系列三 继承和多态特性 c 系列四 运算符重载 c 系列五 静态成员和静态类 c 系列六 友元函数和友元类 c 系列七 STL编程之模板template c 系列八 STL编程之
  • 事件循环机制分享

    Event Loop 即事件循环 是JavaScript或Node为解决单线程代码执行不阻塞主进程一种机制 也就是我们所说的异步原理 要了解事件循环机制首先要了解进程 线程 宏任务 微任务 进程 Process 是计算机中的程序关于某数据集
  • 【STM32F0】Keil 查看局部变量显示

    现象 在进行STM32F0开发的时候出现了 调试代码 添加变量Watch时 显示not in scope 处理方式 因为代码开了优化的处理 把优化改到Level0 就可以解决问题
  • 【深度学习】ResNet残差网络 ResidualBlock残差块实现(pytorch)

    文章目录 前言 一 卷积的相关计算公式 复习 二 残差块ResidualBlock复现 pytorch 三 残差网络ResNet18复现 pytorch 四 直接调用方法 五 具体实践 ResNet进行猫狗分类 六 可能报错 6 1 Typ
  • C语言学习:用C语言实现简单的计算器

    用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器的方法 include
  • 解决Chrome浏览器左键双击没反应,无法启动

    打开任务管理器Ctrl aLT DEL 或是在任务栏图标空白处右击 解决Chrome浏览器点击没反应 2 然后 在进程列中 点击表头排序 之后找到chrome exe进程 解决Chrome浏览器点击没反应 3 右击选择后 结束进程 解决Ch
  • rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm

    update install the packages for libaio bc and flex view plaincopy to clipboardprint root localhost yum install libaio bc
  • ECharts社区里面的gallery在哪里?ECharts gallery新地址

    学习echarts map发现echarts 社区里面没有gallery了 找了好久 终于找到了 这是新地址 https www makeapie com explore html 赶紧收藏
  • 软件测试用例——三角形

    1 题目 输入三个数a b c分别作为三边的边长构成三角形 通过程序判定所构成的三角形是一般三角形 等腰三角形还是等边三角形时 请为该程序设计测试用例 用等价类划分方法 分析 得出测试用例 用判定表法 条件 1 2 3 4 5 6 7 8
  • 嵌入式数据库sqlite3【进阶篇】-如何用C语言操作sqlite3,一文搞懂

    sqlite3编程接口非常多 对于初学者来说 我们暂时只需要掌握常用的几个函数 其他函数自然就知道如何使用了 数据库 本篇假设数据库为my db 有数据表student no name score 4 一口Linux 89 0 创建表格语句
  • Keil MDK报错:Browse information of one or more files is not available----全面的解决方法。

    最近玩stm32遇到一个BUG 报错内容如图 图片来自网络 感谢网友提供图片 如有侵权 请私聊以便删除 本人的报错情况跟这个一模一样 不同的是我的报错文件要多一些 以下是解决方法 方法一 1 点击魔术棒 2 在Output界面中勾选Brow
  • Linux文件系统是怎么工作的?

    本文已收录GitHub 更有互联网大厂面试真题 面试攻略 高效学习资料等 磁盘为系统提供了最基本的持久化存储 文件系统则在磁盘的基础上 提供了一个用来管理文件的树状结构 那么 磁盘和文件系统是怎么工作的呢 又有哪些指标可以衡量它们的性能呢
  • Selenium+WebDriver 各浏览器驱动下载与使用

    Selenium python WebDriver驱动下载与使用 Firefox 火狐 浏览器驱动 Chrome google 浏览器驱动 IE浏览器驱动 Microsoft Edge EdgeHTML 浏览器驱动 Microsoft Ed
  • linux send recv函数详解

    2009 05 10 21 55 int send SOCKET s const char FAR buf int len int flags 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据 客户程序一般用sen