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由于被锁定了,直到发送成功,才能释放..没有实际的经验,凭空理解很困难,希望有经验的高手指证!!
setsockopt( socket, SOL_SOCKET, SO_SNDBUF, (const char*)&len, sizeof(len) );
就表示,我不需要系统提供的发包缓冲区了(好像默认这个缓冲区是8k).我的问题有两个,
1.对于阻塞和非阻塞socket,都有用吗?比如在完成端口模型中,这么设有用吗?
2.将len设置为0,比起使用系统默认缓冲区,有什么好处?能否详细说明?我的理解如下,不知道对不对?
如果设置了发包缓冲区,那么每发起一个WSASend调用,系统会将其中的buf(是更上层的程序传来的数据)拷贝到更底层的发包缓冲区,然后从发包缓存中发送数据.这样,我在调用了WSASend后,由于数据已经拷贝到发包缓冲区了,所以,我可以立即释放buf.
如果没有设置发包缓冲区,那么,系统直接锁定住我传来的buf,免去了复制到系统底层缓冲区的开销.但是,我的buf由于被锁定了,直到发送成功,才能释放..没有实际的经验,凭空理解很困难,希望有经验的高手指证!!
send或sendto先发送到网卡上的缓冲区,然后就返回,也就是说,当send成功后,并不是立即就发送到网络上了。
所以send完后,可以立即释放buf
buf里的东西拷贝到缓冲区里去了
多谢解答..如果我send的数据比较大,比如有1M,但是发包缓存区只有8k,它能完全拷过去吗??