感觉很奇怪,经常在网上看别人说send函数是将用户数据拷贝到协议缓存中了,默认协议缓存是8192B,如果send函数里面的长度大于这个协议缓存那么就返回错误,但我发了一个70000B的数据,居然返回的是70000,并不是返回-1,所以很奇怪,而且更奇怪的是我定义了一个缓存szSendBuf[1024],然后应用这一句rt=send(sock,szSendBuf,70000,0),居然rt也是返回的70000,不仅没有返回-1(因为其大小超过了8192),而且直接无视了szSendBuf真正的大小只有1024,求原因!!!,感觉自己对send函数,recv函数的特性一点都不了解,网上有很多人各种说法,我一个都不敢相信了。求大侠解惑。sendsocketwinsock网络编程

解决方案 »

  1.   

    阻塞的话,底层可能发了多次。直到都发送成功了 send函数才返回。
      

  2.   

    1. rt也是返回的70000,不仅没有返回-1
    ---- 你在对端的recv处断点,停住试试看2. rt=send(sock,szSendBuf,70000,0)时,直接无视了szSendBuf真正的大小只有1024
    ---- 第三个参数代表的就是传输的大小(字节个数),
    ---- 就像定义个数组int arr[10]; 你却这么写: arr[10] = 1;
    ---- C/C++不会校验数组是否越界访问 (但访问到不能访问的数据,可能就会直接crash)
    ---- 总之,不是send的处理错误,而是你自己传参错误
      

  3.   

    关键是我也试了非阻塞一个样子,我问了我们组的高手,他说用getsocketopt获取的8192并不是发送缓存大小而是某个固定长度的倍数,这我刚开始觉得有道理,但是如果真是他说的那样,又如何获取真正的tcp发送缓存大小呢
      

  4.   

    我没法对端,我是连上smtp服务器,直接向smtp服务器发数据
      

  5.   

    自己写个server啊(不需要实现什么功能),sock = accept()之后,recv(sock); // 断点,让程序停在这好了
      

  6.   

    自己写个server啊(不需要实现什么功能),sock = accept()之后,recv(sock); // 断点,让程序停在这好了好吧,其实自己就是偷懒,才连接smtp的,看来还是得写啊
      

  7.   

    自己写个server啊(不需要实现什么功能),sock = accept()之后,recv(sock); // 断点,让程序停在这好了好吧,其实自己就是偷懒,才连接smtp的,看来还是得写啊数据会分帧发送:
    参考这里http://www.360doc.com/content/13/0913/15/13047933_314202256.shtml
      

  8.   

    楼主想问的大概是,非阻塞模式下,send函数返回时数据走到哪一步了,返回值又代表了什么意义。这个问题只有跟踪底层代码才会得到解释根据经验,只要对端接的过来,非阻塞send的返回值就等于你要发送的字节数
    这种情况下,系统会保证数据被发往对端。确认这个就够用了
      

  9.   

    这个我知道,毕竟每层协议的大小只有那么大,我的意思是send那一下子总得有个地方来放这些数据吧,我不相信那么快就能把那么多数据给发送成功出去。我还自己写了个测试程序,诡异得很1G的数据用send一下就发送出去了
      

  10.   

    自己写个server啊(不需要实现什么功能),sock = accept()之后,recv(sock); // 断点,让程序停在这好了好吧,其实自己就是偷懒,才连接smtp的,看来还是得写啊数据会分帧发送:
    参考这里http://www.360doc.com/content/13/0913/15/13047933_314202256.shtml感谢你给我这个链接,这个人测了半天实际上是撤出了mtu最大是1500,mss在linux下是1448在window下是1460这一个事实,更本不是测的发送的数据超过发送缓冲区会怎么样,我简直想笑,我相信他把发送缓冲区设置为默认8192然后发3000个数据,这是发送的数据并没有超过发送缓冲,tcp包照样是分成3次发送,一次只能发送1460个字节,我兼职都不晓得这个人测的东西居然都不是自己想要测试的目的就盲目的测,无语。
      

  11.   

    当你send1G后,观察你程序的内存是不是占了1G
      

  12.   

    这个是必须的,因为我是发给我自己,机子上内测,肯定要开辟1g的空间来接收数据,所以内存立刻被占用1g,我明白你的意思,你让我试这个东西,需要发给别的机子,如果占了1g就说明缓存在本地内存了。但是我现在是自己发给自己,试不出来