1. TCP发送接口:send()

TCP发送数据的接口有send,write,sendmsg。在系统内核中这些函数有一个统一的入口,即sock_sendmsg()。由于TCP是可靠传输,所以对TCP的发送接口很容易产生误解,比如sn = send(...); 错误的认为sn的值是表示有sn个字节的数据已经发送到了接收端。其实真相并非如此。

我们知道,TCP的发送和接收在在内核(linux)中是有对应的缓冲的:

struct sock{

...

struct sk_buff_head receive_queue;  //接收的数据报队列

struct sk_buff_head write_queue;    //即将发送的数据报队列

...

}

对于发送端而言,用户空间调用send(data)等发送接口将数据发送,内核会将data拷贝到内核空间的socket对应的缓冲中,即sock.write_queue。而send()函数的返回值仅仅是表示本次send()调用中成功拷贝的字节数(用户空间->内核空间对应的sock缓冲队列)。具体发送和接收端的接收就由TCP协议完成,虽然TCP是可靠传输,但是这个前提是发送端和接收端的网络是连接的,否则你懂得。这样,对于调用send()发送的用户而言,如果想要确定接收方是否成功接受数据,就得需要靠其他的办法查询。

2. send()阻塞和非阻塞

前面已说过,sn = send(data)负责将数据拷贝到内核空间,而具体发送是有tcp后续完成(这里面就包括流量控制等)。对已阻塞和非阻塞仅仅是对于数据从用空空间拷贝到内核空间的发送缓冲这段期间而言的。

1. 如果发送缓冲剩余空间大于欲发送data的字节数,对于阻塞和非阻塞而言都能成功将数据拷贝至内核缓冲,返回的sn即等于欲发送的数据的字节数。

2.如果发送缓冲剩余空间小于欲发送data的字节数,

a. 阻塞模式,会进行阻塞,等待内核缓冲的空闲空间,然后继续将数据拷贝到内核缓冲中,直到全部拷贝为止。返回rn即为data的数据量。

b. 非阻塞模式,当内核发送缓冲被填满后,立即返回。rn等于data中已被拷贝到发送缓冲的数据量。

3. 如何判定接收成功接收数据?

1.接收端回复应答信息。

这个方法比较土,但也是比较实用的。

2.计算发送端sock已发送数据量

4. 参考:

原文:http://www.cnblogs.com/frydsh/p/3947244.html

linux tcp socket 接收的字节数与发送的字节数不符,TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系...相关推荐

  1. TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系

    1. TCP发送接口:send() TCP发送数据的接口有send,write,sendmsg.在系统内核中这些函数有一个统一的入口,即sock_sendmsg().由于TCP是可靠传输,所以对TCP ...

  2. 图像像素与数据量之间的关系

    像素是图片中的点,一个点是一种颜色,所以点越小图片越逼真,因此相同像素的图片在很小的尺寸下看着更清晰. 计算图片数据量很简单:图片像素*每像素的字节数/8, 这个计算结果的单位是字节. 不同的图片格式 ...

  3. 【微信小程序】微信小程序的接口调入 获取太阳码 根据返回值的类型进行接收,微信接口可能直接返回图片,也可能返回一个错误信息的json,同时兼容处理这两种情况

    目录 事件起因 环境和工具 操作过程 解决办法 遇到的一点问题 结束语 事件起因 在开发一个关于微信小程序的过程中,有一个这样的需求,要求生成微信小程序的太阳码,然而这个东西的请求方式我们是这样的:我 ...

  4. Windows/Linux TCP Socket网络编程简介及测试代码

    典型的网络应用是由一对程序(即客户程序和服务器程序)组成的,它们位于两个不同的端系统中.当运行这两个程序时,创建了一个客户进程和一个服务器进程,同时它们通过从套接字(socket)读出和写入数据在彼此 ...

  5. 基于Linux的SOCKET编程之TCP半双工Client-Server聊天程序

    转自:http://blog.csdn.net/apollon_krj/article/details/53398448#0-tsina-1-64987-397232819ff9a47a7b7e80a ...

  6. Linux下Socket编程之TCP原理

    一.Socket异常信息 之所以把对异常信息的介绍放到原理之前讲,是因为由于socket本身的复杂性,导致了产生各种异常的复杂性.我们应该时刻铭记的是,sokcet本身属于系统(OS),是系统对TCP ...

  7. linux下socket编程处理TCP粘包

    一. 数据接收时会出现以下几种情况 一次接收到了客户端发送过来的一个完整的数据包 一次接收到了客户端发送过来的 N 个数据包,由于每个包的长度不定,无法将各个数据包拆开 一次接收到了一个或者 N 个数 ...

  8. Linux下Socket编程

    Linux下Socket编程    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...

  9. Linux下Socket网络编程

    什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程, ...

最新文章

  1. 使用Windows Azure创建移动服务
  2. MySQL 查看执行计划
  3. mysql 不通过关联查询表_mysql中多表不关联查询的实现方法详解
  4. Android 入门(四) | Intent 实现 Activity 切换
  5. 准考证打印系统关闭怎么办_2019年执业药师准考证无法正常打印,怎么办?
  6. Android中Bundle和Intent的区别
  7. 拓扑学(代数拓扑学)的有趣应用
  8. Monte Carlo Rendering De-noising
  9. Android系统 miui主题,MIUI 主题完全折腾指南
  10. 基于无人售货机商品售卖情况推荐商品
  11. Android Studio中新建assets文件的两种方法
  12. oracle数据库表中文乱码,oracle数据库中文乱码的原因与解决
  13. html5使用websocket发送(PCM)音频数据到服务器,再转在wav文件
  14. 解决麒麟V10上传文件乱码问题
  15. 易语言 网页访问伪造ip
  16. 微分算法 非侵入式负荷识别_非侵入式负荷监测的识别方法和关键技术
  17. Linux_Joth the Ripper工具、NAMP命令
  18. 跨界转型 打造大数据旗舰
  19. 【异常】Maven提示异常XmlPullParserException: Unrecognised tag: ‘exclusion‘ (position: START_TAG seen
  20. OC 基础 UITextView

热门文章

  1. iPhone X 弹出输入框隐藏后页面上移不回位问题的解决办法
  2. [翻译 EF Core in Action 1.7] MyFirstEfCoreApp访问的数据库
  3. C++中去掉string字符串中的\r\n等
  4. PHP06 流程控制
  5. 我在看着你呢——shiro学习
  6. 交换排序之冒泡排序和快速排序
  7. 图论 BZOJ 3669 [Noi2014]魔法森林
  8. 浅谈Spring中JDK动态代理与CGLIB动态代理
  9. 第25月第3天 Mxshop项目记录01
  10. 关于js返回上一页的实现方法