Winsock有个API函数:setsockopt()..如果这么调用:int len=0;
setsockopt( socket, SOL_SOCKET, SO_SNDBUF, (const char*)&len, sizeof(len) );
就表示,我不需要系统提供的发包缓冲区了(好像默认这个缓冲区是8k).我的问题有两个,
1.对于阻塞和非阻塞socket,都有用吗?比如在完成端口模型中,这么设有用吗?
2.将len设置为0,比起使用系统默认缓冲区,有什么好处?能否详细说明?我的理解如下,不知道对不对?
如果设置了发包缓冲区,那么每发起一个WSASend调用,系统会将其中的buf(是更上层的程序传来的数据)拷贝到更底层的发包缓冲区,然后从发包缓存中发送数据.这样,我在调用了WSASend后,由于数据已经拷贝到发包缓冲区了,所以,我可以立即释放buf.
如果没有设置发包缓冲区,那么,系统直接锁定住我传来的buf,免去了复制到系统底层缓冲区的开销.但是,我的buf由于被锁定了,直到发送成功,才能释放..没有实际的经验,凭空理解很困难,希望有经验的高手指证!!

解决方案 »

  1.   

    建议最好先阅读一下tcp/ip协议相关的滑动窗口部分。
    send或sendto先发送到网卡上的缓冲区,然后就返回,也就是说,当send成功后,并不是立即就发送到网络上了。
    所以send完后,可以立即释放buf
      

  2.   

    那如果是一个异步send呢??需要等待send成功后才能释放buf吗?
      

  3.   

    不需要等待。
    buf里的东西拷贝到缓冲区里去了
      

  4.   

    ouyh12345 :
      多谢解答..如果我send的数据比较大,比如有1M,但是发包缓存区只有8k,它能完全拷过去吗??