Linux下Socket网络编程send和recv使用注意事项
1.send函数
ssize_t send( SOCKET s, const char *buf, size_t len, int flags );
(1)send先比较待发送数据的长度len和套接字s的发送缓冲的长度, 如果len大于s的发送缓冲区的长度,该函数返回-1;
(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的发送缓冲区的剩余空间里)。
注意:
(1)如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回-1;如果send在等待协议传送数据时网络断开的话,那么send函数也返回-1。
(2)要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回-1。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回-1)
(3)在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是终止进程。
2.recv函数
ssize_t recv(int s, char *buf, size_t len, int flags);
(1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲
中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR。
(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数 据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中。(注意:协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的)
(3)recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。
Q&A:
(1)两次send一次recv会发生什么?
一次性读取两次send的内容。
(2)recv之后,接收缓冲区会被清空吗?
是的。
Linux下Socket网络编程send和recv使用注意事项相关推荐
- Linux下Socket网络编程
什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程, ...
- Linux下Socket网络编程之点对点聊天室
1. 系统设计的目的与意义 掌握信号与信号处理的概念,了解点对点聊天室的设计需求,掌握相关的理论知识,切实掌握程序设计的分析方法,勇于实践,多参考开源项目和代码.实现点对点聊天室程序设计,Linux网 ...
- 基于Linux的socket网络编程项目——游侠手机商城
基于Linux的socket网络编程项目--游侠手机商城 一.项目说明 二.项目使用的技术 三.客户端搭建 四.服务器端搭建 一.项目说明 本项目是一个仿真手机商城类系统,基本功能: 登录界面功能:用 ...
- 【Linux】socket网络编程之服务器与客户端的数据交互
[Linux]socket网络编程之服务器与客户端的数据交互 前言参考 argc !=2是什么意思 inet pton函数 对stdin,stdout 和STDOUT_FILENO,STDIN_FIL ...
- Linux下TCP网络编程-创建服务器与客户端
一.前言 互联网概念诞生于20世纪60年代末,从9几年中国接入互联网开始到现在,生活的每个角落都能看到网络的使用.现在物联网时代.共享经济的到来,生活中不仅仅电脑.手机可以接入网络,身边的各个设备也能 ...
- Windows/Linux TCP Socket网络编程简介及测试代码
典型的网络应用是由一对程序(即客户程序和服务器程序)组成的,它们位于两个不同的端系统中.当运行这两个程序时,创建了一个客户进程和一个服务器进程,同时它们通过从套接字(socket)读出和写入数据在彼此 ...
- 【Socket网络编程】17. recv() 函数详解
recv函数 int recv( SOCKET s, char *buf, int len, int flags); 参数说明 第一个参数指定接收端套接字描述符: 第二个参数指明一个缓冲区,该缓冲区用 ...
- Linux下Socket TCP编程
一.新手入门 1.socket即为套接字,在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一的标识网络通讯中的一个进程,"IP地址+TCP或UDP端口号&quo ...
- linux下c网络编程实现串口与网口的信息透传_串口网口数据透传程序
comtcp简介 comtcp程序实现linux平台下串口网口数据转发功能,将串口与网口数据透明转发,应用该程序可以用网络TCP访问串口设备; #include#include#include#inc ...
最新文章
- 聊聊Spring Boot服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!...
- 5GS 协议栈 — NR 空中接口协议栈
- 分页控件-ASP.NET(AspNetPager)
- java结构体构建学生 学号_易错题: 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。...
- PHP修改PHP.ini上传大文件的解决办法
- C / C++ const 的区别和使用
- java ssh shell命令_java 通过ssh 执行命令
- java实现工单派发_编写官方微信支付 Java SDK 的同学领下工单!
- linux备份数据库软件有哪些内容,Linux网络备份MySQL数据库的应用方法
- demo是什么?demo有什么用?
- matlab 函数教程,MATLAB函数 - Matlab教程
- java网络通信技术示例:简单的聊天小程序
- Python——>图像的字符画绘制
- 叮咚智能音箱使用体验:好看的皮囊千篇一律,有趣的灵魂万里挑一
- 老DOS游戏-殖民计划
- 新浪微博一键分享手机版JS代码
- 什么是泛型中的限定通配符和非限定通配符 ?
- 欢迎到我们的学海灯塔给我们留言
- python一个数的阶乘_python整数阶乘计算
- Unity3D中引用Spine2D动画研究学习(一)
热门文章
- 会议管理SaaS平台Social Tables融资1300万美元
- [CentOs7]iptables防火墙安装与设置
- 差分约束系统 POJ 3169 Layout
- android微信第三方登录怎么通过code获取openid?
- SQL允许你用EXECUTE执行一个变量中定义的SQL语句,并且允许你在被执行的SQL语句中,再次嵌套入一个变量定义的语句,并且再次在其中用EXECUTE执行它...
- outlook常见错误分析指南
- 我的几个.NET编程习惯
- Python实战之子进程
- 数控机床手动编程能否用计算机验证,数控编程的方法有几种_数控编程的步骤...
- L1-066 猫是液体 (5 分)-PAT 团体程序设计天梯赛 GPLT