关于socket中的send函数
来源:互联网 发布:新淘宝店铺开了没人买 编辑:程序博客网 时间:2024/05/01 20:07
关于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函数
- 关于socket中的send函数
- Socket 中的send函数和recv函数
- 关于socket Send 代码
- 关于SOCKET中send和recv函数工作原理总结
- 关于SOCKET中send和recv函数工作原理总结
- 关于SOCKET中send和recv函数工作原理总结
- 关于SOCKET中send和recv函数工作原理总结
- 关于socket send recv 两个函数各种错误说明
- 关于SOCKET中send和recv函数工作原理总结
- socket通信中的几个函数--accept(),send(),recv()。
- socket通信中的几个函数--accept(),send(),recv()
- socket recv和send函数
- socket中的send和recv
- Socket send函数和recv函数详解
- Socket send函数和recv函数详解
- Socket send函数和recv函数详解
- Socket send函数和recv函数详解
- 1044. Shopping in Mars (25)
- Shell编程基础 Ubuntu
- 学习:java设计模式—Decorator模式
- Simple XML to NSDictionary Converter
- 我要找到你
- 关于socket中的send函数
- 1045. Favorite Color Stripe (30)
- Android小技巧之安装程序报错:INSTALL_FAILED_DEXOPT
- 学习:java设计模式—Observer模式
- 双绞线
- Hibernate三种状态以及save、update和saveOrUpdate
- cocos2dx-新建工程时避免文件和文件夹的拷贝
- JAVA 多线程-死锁
- android MotionEvent.obtain模拟事件,自动触发