在包的源文件中有这样一句话:
const
  ReadBufferSize = 5000; // max to read at a time using Recv() or write
我把这个常量改大不会有什么副作用吧?

解决方案 »

  1.   

    我看了一下源程序,已经是每个线程用各自的缓冲区了,为5000字节,但我不知道改大后会不会不好,如效率?等等,我知道缓冲区参数很重要,一些modem加速软件就是修改参数提速的,所以我不敢轻易修改。另外,为什么会发生缓冲区冲掉呢?我不明白,tcp/ip不是自动控制流量吗?
      

  2.   

    我到vc区查了一下,上面说是发送方调用socket的send函数没有检查返回值,没有重发因为接收方处理缓慢而丢失的数据,但我的问题是我不可能控制发送方(网站),只能在我的接收方想办法,现在的问题比较清楚了,请问我用setsockopt函数把接收缓冲区扩大行吗?会不会有副作用?
      

  3.   

    肯定是你写的有问题。如果用udp协议,丢包是正常的,需要自己做校验。
    如果是tcp,必须要检查send函数的返回值。如果什么网站服务器做成不检查send返回值的那肯定是个大bug,跟接收者无关。发送缓冲区再大,也可能有缓冲区满而“丢包”的情况。另外,接受者也应该判断接收缓冲区是否都取出来了,是否有丢弃的数据。
      

  4.   

    to flywhc(午夜蓝调):我明白了,不是网站方的问题,但是网站方检测到接收方缓冲区不够会关闭连接而不再重发!需要客户方再次申请,和浏览网页时遇到的情况相同。
    to ybudi(菜牛):如果我的从缓冲区取数据的线程跟不上数据到来的速度(太猛了),是不是会出现丢数据的情况?现在的情况看起来就是这样,毕竟是100个线程分时工作,还有一些界面更新显示动作。
    我现在想这样解决:建立socket后,把接收缓冲区用setsockopt设置成128K,这样,即使我来不及调用recv,仍然有128K的内部缓冲,对一般的网页足够了,请问大家是否可行。
      

  5.   

    天哪,100个线程,很失败很失败的线程模型了。人家IIS那么大的服务器才用几个线程。
    如果根本没有什么阻塞的操作,开的线程越多越不好。
    优化你的算法吧。网站那边发现缓冲区不够不会关闭连接的,除非发生错误。肯定是你的client发现缓冲区溢出造成的错误。不过一般也不会发生这种情况,缓冲区满了也没关系,服务器端就等什么时候取出来就再次发送TCP是个稳定的协议。我想你是做个netants那样的东西吧。所有网络操作放到一个线程里就够了,用非阻塞socket,不可能有数据来不及取出的情况。128K缓冲太大了,系统的8k其实足够。甚至你可以用overlapped i/o,设置系统的缓冲区为0,速度更快