send函数特点及相关问题

原创 2007年09月22日 16:37:00
 

HTML Tags and JavaScript tutorial



send函数特点及相关问题





在send函数的help里面看到
The successful completion of a send call does not indicate that the data was successfully delivered.
send成功完成并不代表数据已经成功送达。
If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode.
如果没有缓冲存储待发送的数据,send会阻塞直到socket被设置为非阻塞模式,
On nonblocking stream-oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both client and server machines.
在非阻塞流模式socket中,写入的字节可以是1到需要的长度,依赖于客户端和服务器的缓冲。
The select or WSAEventSelect function can be used to determine when it is possible to send more data.
select 或 WSAEventSelect 函数可以用于决定什么时候可以继续发送数据
阻塞模式下send并不是说直到你发送数据到对方机器才返回的意思,它是说把你要发送的数据放入发送缓冲后,就直接返回。而不是阻塞时,如发送缓冲区没有了,他就直接返回,而阻塞时会等待发送缓冲区有空间。
先看看在阻塞模式下send的表现吧(注意缓冲区的大小,我这里是16k)
1,发送一个小于16k的数据,send马上就返回了
      也就说是,send把待发送的数据放入发送缓冲马上就返回了,前提是发送的数据字节数小于缓冲大小
2,发送一个大于16k的数据,send没有马上返回,阻塞了一下
      send一定要把所有数据放入缓冲区才会返回,假设我们发32k的数据,当send返回的时候,有16k数据已经到达另一端,剩下16k还在缓冲里面没有发出去
在阻塞模式下
如果发送成功,返回的nBytes一定等于len
        nBytes = send(m_socket,buf,len,0);
也就是在上面代码中那个发送循环其实是没有必要的
再看看在非阻塞模式下的情况吧
1,发送一个小于16k的数据,send马上返回了,而且返回的字节长度是等于发送的字节长度的,情况和阻塞模式是向相同的
2,发送一个大于16k的数据,send也是马上就返回了,返回的nByte小于待发送的字节数
      来模拟一下实际情况,假设我们有32k的数据要发送,
      第一次send,返回16384字节(16k),也就是填满了缓冲区
      第二次send,在这之前sleep了1000毫秒,这段时间可能已经有5000字节从缓冲区发出,到达另外一端了,于是缓冲区空了5000字节出来,相应的,这次返回的是5000,表示新放入了5000字节到缓冲区
      第三次send  ,和第二次相同,又放了6000字节
      最后一次send,放入了剩下的字节数,这个时候缓冲还是有数据的。
再发送大于16k数据的情况下,那个send发送循环就是必须的了
[Ref Link]http://www.cppblog.com/artmouse/archive/2005/12/14/1762.aspx


派生类的三种继承方式总结

派生类的三种继承方式公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。  1. 公有继承(public)  公有继承的特点是基类的公有成员和保护...
  • qq1169091731
  • qq1169091731
  • 2016年03月19日 23:32
  • 201

函数关系与相关关系

当变量间存在影响或者制约时,可将其分为函数关系和相关关系。 函数关系:如果变量x的每一个确定值,都可以通过关系式y=f(x)使得变量y有一个确定的值与x相对应,反之亦然,那么此时称x与y具有函数关系。...
  • liuy_yy
  • liuy_yy
  • 2011年01月13日 10:11
  • 2243

欧几里德算法及拓展

转自:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数...
  • youchengyuanzhi
  • youchengyuanzhi
  • 2015年05月20日 16:04
  • 219

浮动特点及相关问题

CSS中的定位机制:普通流,浮动,绝对定位。 1.普通流: 普通流 (normal flow),或者称之为常规流。也是我们通常称呼的“文档流”。 2.浮动:浮动的框可以左右移动,直至它的外边缘遇到...
  • shiqianrongcsdn
  • shiqianrongcsdn
  • 2015年05月06日 19:59
  • 879

关于socket send recv 两个函数各种错误说明

首先吐槽以下微软的socket的两个最重要的API:send函数和recv函数,本菜鸟感觉这两个函数是用来给程序员自己开发的函数,用起来跟翔一样的体验。 int recv( _In_ SOCKE...
  • yiyefangzhou24
  • yiyefangzhou24
  • 2016年10月31日 13:25
  • 997

linux send与recv函数详解------内附代码

转载地址: http://blog.csdn.net/sjin_1314/article/details/9565743        [csharp] view plain copy ...
  • stpeace
  • stpeace
  • 2017年06月22日 00:11
  • 2496

send函数详解

服务端都已经accept了客户端的请求,于是客户端与服务端也就勾搭上了,可以暧昧了,可以发信息了,怎么发送呢?用send函数即可,我们来看看send函数的原型: WINSOCK_API_LINKAGE...
  • stpeace
  • stpeace
  • 2013年10月29日 21:58
  • 8525

Activity的生命周期函数

一、7个生命周期函数
  • kp_liu
  • kp_liu
  • 2014年08月05日 16:59
  • 757

ICT领域面试常见问题总结(一)

最近面试在基础知识这块表现不好,所以想着有空就总结下学过的知识点,一方面当是帮助记忆顺便练练笔,另一方面也可以把有些话题放在网上和大家探讨一下。 主要分四章来总结这些问题 包括:网络、操作...
  • ChaosDoctor
  • ChaosDoctor
  • 2013年12月09日 17:19
  • 607

send和recv函数解析

1. send函数 int send( SOCKET s, const char FAR *buf, int len, int flags );   不论是客户端还是服务器端应用程序都用s...
  • Hmillet
  • Hmillet
  • 2016年03月18日 08:33
  • 1378
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:send函数特点及相关问题
举报原因:
原因补充:

(最多只允许输入30个字)