当前位置:  技术问答>linux和unix

【急问】:关于send()和recv()的问题

    来源: 互联网  发布时间:2016-06-05

    本文导语:  问题场景:发送端连续发送send()几百K的大包,接收端连续接收recv(),并把接收到的数据流存入接收buffer中; 问题:1。接收端会不会要多次调用recv()才能把一个包接收完?       2。如果上面的但是是“肯...

问题场景:发送端连续发送send()几百K的大包,接收端连续接收recv(),并把接收到的数据流存入接收buffer中;

问题:1。接收端会不会要多次调用recv()才能把一个包接收完?
      2。如果上面的但是是“肯定”的,那么会不会出现这样的情况:在一次recv()得到是数据是前一个包的后面部分和后一个包的前面部分的组合?
      3。如果第二个问题的答案也是“肯定”的,那么新的问题又出来了,当一个包还没recv()完整,现在就清空了接收数据的buffer,又重新recv()接下来的数据,并存入接收buffer中,那么现在怎么才能把数据中的完整包分离出来呢?

      有什么好的解决方法呢?

|

这个问题是这样的(我以TCP为例来解释):

1、你说的发送端有几百K的大包,这里说的不严密吧?应该是有几百K的数据吧。因为在IPv4的网络里,一个IP包
最大是65535,不可能达到你说的那种一个包几百K。所以我假设你说的是几百K的数据。

2、如果是几百K的数据,那么首先是从应用进程缓冲区将数据写到内核缓冲区,通常是执行write(),write()返回
了以后,也只是说你成功的将数据由引用进程拷贝到了内核缓冲区里面去了,至于能不能安全的到达对端,还是未
知数。

3、这样的数据被发送到对端,首先到对端的内核缓冲区,然后从内核缓冲区再拷贝到应用程序的缓冲区。也就是
rcv()的过程,因为数据可能被分成很多个包,所以可能需要多次调用read()才行。在收端读完数据以后,会给发
送端回确认消息,这时候发送端才会删除内核缓冲区中的数据,否则过一段时间没有收到确认消息,会重发的。

4、因为TCP是面向字节流的协议,所以很可能上层数据被分割到多个TCP包里面去了。但是在接收端这面,又会重
新的组合在一起的,再加上TCP的超时重传和确认分组机制,可以保证数据不会丢失,不会乱序。

5、如果是包过大,超过了MTU,会有IP包的拆包和重组,这个不用担心,是内和协议栈的IP部分自动处理的。

|

    
 
 

您可能感兴趣的文章:

  • linux下socket的send函数阻塞问题?
  • 关于socket的send(),recv()的问题.
  • expect 关于send关键的问题
  • ##socket编程中send&recv的问题
  • 用socket的send发送一个自定义类的问题
  • 很奇怪的问题:linux下tcp send导致服务器进程崩溃
  • 问一个socket问题,服务器不停send,客户端进入睡眠服务器会断开
  • 问一个socket send的问题
  • 关于socket中send函数的一个问题请教
  • 一个网络编程中send函数的菜鸟问题
  • 奇怪的socket问题,关于如何设置send非阻塞
  • 高分请教socket简单问题:客户端send数据过去,没有反应,recv时候失败。
  • 极富挑战性的问题啊!popen导致send函数失败的问题。
  • sock send问题,紧急求救
  • 虚拟机的linux,在其中运行Server和Client,Server端send了一个大小4096B的包,客户端recv到3845B,用netstat查看连接,Recv-Q和Send-Q项显示为0,为什么没收完?其余字节哪去了??
  • socket中的疑问:read,write和send,recv的区别
  • 为何我windows下面send 成功了。 。。但是linux的recv确返回 0
  • 请教,socket中recv不能一次完全接收send发送的字节数?
  • socket编程中的函数send和recv如何被信号中断?
  • 谁知道solaris对socket的recv和send函数是否是原子操作,谢谢!!
  • 做socket程序,用recv,send这些函数好还是用fread,fwrite好?
  • 如果两个线程操作同一个Socket,一个线程recv,另一个send。这样会不会导致程序莫名其妙的退出
  • linux下还有数据没有recv完,能send数据吗?
  • send与recv标志参数什么意思?
  • socket编程中的函数send和recv如何被信号中断? iis7站长之家
  • 为什么用socket的send和recv传数据,总会丢失一些数据
  • 用socket去connect后,recv和send都出错
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类datagramsocketimpl的类成员方法: send定义及介绍
  • #define send _send 那么_send是在哪里实现的呢?minix源代码
  • java命名空间javax.sound.midi接口receiver的类成员方法: send定义及介绍
  • 面试题,socket进行send操作始终send不出去该怎么办?
  • java命名空间javax.sound.sampled类floatcontrol.type的类成员方法: aux_send定义及介绍
  • socket send()函数错误
  • java命名空间javax.sound.sampled类floatcontrol.type的类成员方法: reverb_send定义及介绍
  • 请教:socket编程中send和write的区别
  • java命名空间javax.security.sasl类sasl的类成员方法: raw_send_size定义及介绍
  • linux 网络编程中 send()函数出错
  • java命名空间java.net类datagramsocket的类成员方法: send定义及介绍
  • 怎么的到send()出错信息
  • java命名空间java.net类multicastsocket的类成员方法: send定义及介绍
  • 网线断开后,send函数返回值大于0,而不是-1
  • java命名空间java.nio.channels类datagramchannel的类成员方法: send定义及介绍
  • expect中为send语句上加变量的代码
  • [求助]请问socket编程中send()函数可以发送整形数据吗?
  • 请问如何捕获linux c SOCKET中SEND的错误,请指教,谢谢!
  • 网络编程中:用SEND发包时,如何预先知道可用的发送缓冲区有多大?急!!!
  • socket send的返回值
  • 两台linux机器如何发送消息,如win2000下面的net send ?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3