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. Zookeeper下载
  2. 我不是码神!Serverless真的可以为所欲为?
  3. Python文件操作-文件的增删改查
  4. 开发过程中编写的一些批处理
  5. 深入解读MySQL8.0 新特性 :Crash Safe DDL 1
  6. 它身上的飞秋 战衣给他添上了英武的气势
  7. python课程_python课程大放送
  8. 花了一个月精心准备30张可视化大屏模板,可直接套用,拿走不谢
  9. 生成Apk签名证书keystore,openssl与证书,keystore,jks,pem/pk8
  10. HashMap底层数据结构
  11. 面试官:说说你对SPA(单页应用)的理解?
  12. ESP8266开发之旅 阿里云物联网平台篇⑥ LED智能灯控制系统 全面讲解,上手一个小项目(MQTT客户端直连 + Web配网 + WebSocket局域网通信)
  13. 尾注参考文献之后添加附录致谢解决办法
  14. 雾霾、压力、不良习惯对肌肤的4大危害
  15. Selenium||解决给元素输入文本失败问题
  16. VBA实战(09) - 工作簿(WorkBook)
  17. Java代理服务器---Freedom_Server
  18. 抑菌洗手液做MSDS中英文报告详细说明
  19. CSS—移动端适配方案flexible.js
  20. 苹果字体对应font-weight大小

热门文章

  1. 学习SQL:使用日期和时间函数创建SQL Server报表
  2. 股债轮动策略之行业版
  3. Questions make me doubt my engineer career
  4. 使用Postman对Restful接口进行测试
  5. document 对象 html文档内容
  6. [IDEA] 快捷键学习
  7. WPF中的图像处理简介
  8. Jquery实现鼠标双击Table单元格变成文本框
  9. js实现(可实现局部打印)
  10. 牛客网NOIP赛前集训营 第6场 T1 最长路