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已发送数据量

     可参考:如何判断TCP数据包是否发送成功 作者提到可以使用 ioctl接口:ioctl(tcp_socket, SIOCOUTQ, &value);

原文地址:http://blog.csdn.net/ordeder/article/details/17240221

最新文章

  1. 进一步丰富和简化表单管理的组件:form.js
  2. aaa
  3. SVN 升级后出现You need to upgrade the working copy first.
  4. 手动启动mongodb和nodejs程序
  5. Access-Control-Allow-Origin: Dealing with CORS Errors in Angular
  6. robot framework安装步骤
  7. memcache和memcahced的区别
  8. 从SVN导出指定版本号之间修改的文件(转)
  9. lnmp停用nginx,改用apache
  10. DIV当textarea使用,在聚焦的时候将光标移动到内容的末尾
  11. CentOS6.5下安装oracle11gR2
  12. PHP基础入门详解(一)【世界上最好用的编程语言】
  13. poj 2486 Apple Tree(树形DP 状态方程有点难想)
  14. jQuery属性操作总结
  15. spark操作Kudu之读 - 使用DataFrame API
  16. django系列8.2--django的中间件流程
  17. P4环境搭建
  18. 一些常用的UI控件
  19. 64_j2
  20. gulp插件之-----转化es6代码到es5 取消严格模式 remove "use strict" directive

热门文章

  1. php文件遍历
  2. JS数组随机排序
  3. Python爬虫学习笔记——豆瓣登陆(二)
  4. JSBinding + SharpKit / 实战:转换 Survival Shooter
  5. MySQL 日志管理详解
  6. 11g RAC日志体系(cluster,database,asm,scan日志,ADRCI工具的使用)
  7. ToDictionary,ToLookup
  8. background-position 用法详细介绍
  9. Mongo导出数据文件导致错误 Got signal: 6 (Aborted)解决方法
  10. python中保留两位小数