关于Send其实我是要调用send函数,但是在一个地方看到了下面的一段话:

当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果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里的缓冲区参数。另一种就是套接字缓冲区,是由协议自定的。可以用getsockopt获取其大小,并用setsockopt重置其大小。发送的时候使用send实际上是从用户缓冲区发送到socket缓冲区中,至于数据真正何时发送给另一端则是由协议规定的。Recv也类似。

看了这段话之后,我使用Windsock先获取了socket缓冲区为8192,但是直接发送10000的数据也不会阻塞,在我的机器上发送23684时候阻塞,在别的机器上是不同的值,不知道内部是如何实现的。但是如果不断发送同时另一端也在接受,且用户定义的接受缓冲区的大小大于8192的话,在之后的发送过程中会每次填充8192;如果另一端用户定义接受缓冲区小于8192,如1000则发送端就会分开发送,如3752一次,4440一次,并且之后都是这样,加起来也是8192,就是不明白windsock的send的内部实现机制了。

之后问了师兄,师兄说按照Unix下的send实现的话应该是先检查用户缓冲区是否大于socket发送缓冲区,如果大于则分批次发送,每次拷贝socket缓冲区大小之后发送,发送的时候socket缓冲区锁定,发送之后在从用户缓冲区接受直至发送完毕为止。如果小于则直接发送。在socket缓冲区发送的过程中这个缓冲区是锁定的。

所以就不明白了,现在也用不到就不仔细查了,希望看到这个问题的高人给解释下!先谢过。

关于socket中的send函数相关推荐

  1. Socket中的send函数

    send()函数: 函数原型:int send(SOCKET s,const char *buff,int len,int flag); 不论是客户端还是服务端都用send函数来向TCP发送连接的另一 ...

  2. socket中结构与函数

     IP地址的作用是标示计算机的网卡地址,每台计算机都有一个IP地址:端口,是指计算机中为了标示在计算机中访问网络的不同程序而设的编号,并不是网卡接线的端口,而是不同程序的逻辑编号,并不是实际存在的 ...

  3. linux select函数返回值,socket中的select函数使用

    socket select()函数用于定时检查以创建的socket句柄的状态,以确定设定的socket句柄当前是否可写或有数据可读. select函数提供了一种方法,使得程序在操作socket时(如r ...

  4. linux socket 结构定义 send,Linux下Socket编程中用send发送结构体

    Linux网络通信 Linux下多客户端聊天软件 最近在开发一个Linux下的聊天软件,好久没有做C语言的开发了,感觉到很多东西已经生疏了,这下又碰到用Socket传递结构体的问题,google了一下 ...

  5. c语言send发送结构体,Socket编程中用send发送结构体

    Socket编程中用send发送结构体 原创 2010年04月28日 19:17:00 标签:socket /编程 /struct /google /string /input 11868 最近在开发 ...

  6. Linux下Socket编程中用send发送结构体

    转自:http://tech.ddvip.com/2008-10/122543769687623.html Linux网络通信 Linux下多客户端聊天软件 Linux程序设计 Linux socke ...

  7. Socket的send函数在执行时报EAGAIN的错误

    Socket的send函数在执行时报EAGAIN的错误] 内容提要: 当客户通过Socket提供的send函数发送大的数据包时,就可能返回一个EGGAIN的错误.该错误产生的原因是由于send 函数中 ...

  8. PB Send()函数应用有关数据整理

    PB Send()函数应用有关数据整理 Send()函数定义:Send(handle,message#,lowword,long) 其中的message#是一个UnsignedIntege,就是WM_ ...

  9. 关于SOCKET中send和recv函数工作原理总结

    send函数工作原理: send函数只负责将数据提交给网络协议层. 当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SO ...

最新文章

  1. databinding 入门 知识 给TextView 赋值
  2. mysql源码如何解析where字句_MySQL解析器源码分析--对select语句中子查询处理逻辑的分析(一)...
  3. C语言字符串做函数参数
  4. cocos2d-x游戏实例(21)-纵版射击游戏(8)
  5. linux 多个会话同时执行命令后history记录不全的解决方案
  6. shiro前后端分离_为什么要前后端分离?前后端分离的优点是什么?
  7. 选择Java加密算法第3部分–公钥/私钥非对称加密
  8. vmstat命令列出的属性详解
  9. 循环队列的介绍与实现
  10. 数据库高级知识——查询截取分析(一)
  11. python二维数组换行输出_关于用python绘制二维数组的问题
  12. 在MySQL中创建cm-hive使用的数据库及账号
  13. 超过 C++、压制 Java 与 C,Python 拔得 TIOBE 年度编程语言!
  14. easyui刷新几种方式
  15. lu分解 百度百科
  16. onenote打开闪退平板_轻松解决Win10 OneNote打不开或闪退的问题
  17. libero soc 仿真74HC161
  18. 学java好还是学挖机好_现在开挖掘机还能月入上万吗,为何年轻人还是热衷于学挖掘机?...
  19. APP - 支付宝怎么延时转账?能否撤回转账?
  20. C程序设计 谭浩强 第九章

热门文章

  1. 曼哈顿距离,欧式距离,余弦距离
  2. android界面设计所用中文什么字体,手机软件中的字体是什么字体,ui界面设计用什么字体...
  3. Revit 二次开发 获取多段轴网的location
  4. 基于区块链溯源系统后端开发
  5. 学机器学习的基础课程
  6. 前端VS后端Web开发
  7. MySQL(查询语句,关键字)
  8. oracle rr与yy日期格式
  9. 软件体系结构-03-层次体系结构概述
  10. uniapp简单搞定支付