从网络层向逻辑层传递数据的问题

3 views
Skip to first unread message

andy_g

unread,
Mar 9, 2006, 6:15:23 AM3/9/06
to 高性能网络编程邮件列表
Hi all:

一般情况下,从网络中接收到数据后,都会将数据复制给业务逻辑层
来处理,而逻辑层
在发送数据的时候,一般会将发送的数据复制到WSASend的缓冲区中,有个疑惑就是大家
有什么办法将接收到的数据缓冲区指针直接放到后面要处理的队列中,除了将overlapped
plus结构的地址直接放进队列中,还有没有别的办法呢?,谢谢:)

Ghost Cheng

unread,
Mar 9, 2006, 7:19:50 PM3/9/06
to dev4s...@googlegroups.com
Hi andy_g:
Recv的时候因为要拼包,所以肯定要有一次memcpy的,这个没办法,
至于send的时候,我是先从内存池取一个OV结构,然后直接将数据写在发送缓冲区,可以避免memcpy。


 
On 3/9/06, andy_g <and...@163.com> wrote:
Hi all:

一般情况下,从网络中接收到数据后,都会将数据复制给业务逻辑层
来处理,而逻辑层
在发送数据的时候,一般会将发送的数据复制到WSASend的缓冲区中,有个疑惑就是大家

andy_g

unread,
Mar 11, 2006, 12:23:43 AM3/11/06
to 高性能网络编程邮件列表
谢谢Ghost Cheng
的回复,,但是一般上层在处理的时候都会有一个发送队列,在网络层发送完毕一个数据包后会通知发送队列发送下一个数据包,问题是往队列中放的时候也要一次memcpy,根据你的说法,是将内存池中取出的那个ov
plus结构放到发送队列中吧

soar...@msn.com

unread,
Mar 15, 2006, 5:09:26 AM3/15/06
to 高性能网络编程邮件列表
一个消息包在它的生存期内最好只有一份唯一的数据,这样可以减少内存拷贝带来的开销。
Ghost Cheng
说了,Recv的时候因为要拼包,所以肯定要有一次memcpy的,的确是这样,
除了这次内存拷贝,以后的进出队列就直接操作指针,当然,如果你的消息包还需要经过
别的处理,比如发送前加密,那就至少又增加了一次内存拷贝了。
Reply all
Reply to author
Forward
0 new messages