社区
网络编程
帖子详情
socket内部有自己得缓存,一般得发送的过程都有数据拷贝,如何为socket指定内存?
xl5338870
2006-09-04 02:36:14
socket内部有自己得缓存,一般得发送的过程都有数据拷贝,如何为socket指定内存?
...全文
704
9
打赏
收藏
socket内部有自己得缓存,一般得发送的过程都有数据拷贝,如何为socket指定内存?
socket内部有自己得缓存,一般得发送的过程都有数据拷贝,如何为socket指定内存?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xl5338870
2006-09-04
打赏
举报
回复
发送内存分配器:分配和回收发送的内存。
发送对列:存放所有需要发送的缓存信息。
伪代码:
SendingProc() {
...
while (从发送队列中中取发送缓存,队列空则block自己) {
设置发送socket的发送缓存(这个不知道如何做)
测试socket发送有效条件并开始发送
}
}
shefg_great
2006-09-04
打赏
举报
回复
我现在是这么考虑的,做一个内存分配器,管理所有发送的缓存,设置一个发送队列,
然后发送的时候依次从队列中取出缓存来发送,这么做是不是可以?
这么做是可以的,而且效果不错,有人已经实现你的这种思想了,可以在程序员沙龙下载别人的实现代码。程序员沙龙地址是:http://www.pudn.com/
晨星
2006-09-04
打赏
举报
回复
这个就不太清楚了,帮你顶一下吧。
Tananbaum的《Computer Networks》一书中也提到过这个问题,不管是TCP/IP协议栈,还是ISO协议栈,协议的各个层之间不断的数据拷贝的确能引发效率问题。
但常常这也没办法。比如底层在组包时,总不好包含一个指针,那样反而也会影响发送效率,而且大大增加协议的实现难度和对上层程序设计者的要求。
xl5338870
2006-09-04
打赏
举报
回复
IOCP一般是处理tcp的。我用udp包。
我现在是这么考虑的,做一个内存分配器,管理所有发送的缓存,设置一个发送队列,
然后发送的时候依次从队列中取出缓存来发送,这么做是不是可以?
请高手指教。
晨星
2006-09-04
打赏
举报
回复
所谓“导致性能影响呢”,我的理解是一旦没有底层缓冲,就必须同步发送,数据没真正发出去函数就绝不退出。
——本来把数据交给底层的网络服务组件就可以了,它自然会尽快发出去,你的程序可以去干别的事了。
baojian88888
2006-09-04
打赏
举报
回复
使用完成例程或完成端口
晨星
2006-09-04
打赏
举报
回复
这是两个层次的问题吧。
一般你的数据缓冲可能很快会释放到,而如果发送时底层采用的是异步机制,那岂不是会有问题?
xl5338870
2006-09-04
打赏
举报
回复
自己指定缓冲区不是可以减少一次数据拷贝的过程吗?
这样为什么还会导致性能影响呢?
DentistryDoctor
2006-09-04
打赏
举报
回复
设置发送缓冲区大小零,这样就可以直接你给的缓冲区了。但性能上会有影响,一般不建议这么做。
Python网络编程(
socket
)
网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?答案就是
socket
.
socket
翻译为套接字,它本质就是在应用层和传输层(TCP/IP协议族通信)之间的一个抽象层,是一组接口,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。该课程包括OS模型,TCP/IP协议,
socket
函数等Python网络编程基础知识。
C语言
socket
send()
数据
缓存
问题
send()函数默认情况下会使用Nagle算法,Nagle算法通过将未确认的
数据
存入缓冲区直到积攒到一定数量一起
发送
的方法,来减少主机
发送
零碎小
数据
包的数目。所以如果send()函数
发送
数据
过快的话,该算法会将一些
数据
打包后统一发出去。如果不了接这种情况,接收端采会遇到看似很奇怪的问题,比如成功recv()的次数与成功send()的次数不相等,在这中情况下,接收端可以通过recv()的返回值是否为
linux
socket
接收
缓存
区,
socket
的
发送
和接收缓冲区
对于每一个TCP的
SOCKET
来说,都有一个
发送
缓冲区和接受缓冲区与之对应,下面举个例子说说
发送
缓冲区、接受缓冲区、滑动窗口协议之间的关系。一、recv端在监听套接字上准备accept,在accept结束以后不做什么操作,直接sleep很久,也就是在recv端并不做接收
数据
的操作,在sleep结束之后再recv
数据
。二、send端通过查看本系统内核支持的
发送
缓冲区大小,cat/proc/sys/n...
socket
的
发送
与接收缓冲区
应用程序可通过调用send(write, sendmsg等)利用tcp
socket
向网络
发送
应用
数据
,而tcp/ip协议栈再通过网络设备接口把已经组织成struct sk_buff的应用
数据
(tcp
数据
报)真正
发送
到网络上,由于应用程序调用send的速度跟网络介质
发送
数据
的速度存在差异,所以,一部分应用
数据
被组织成tcp
数据
报之后,会
缓存
在tcp
socket
的
发送
缓存
队列中,等待网络空闲时
2、
数据
拷贝
过程
一、用户空间与内核空间 二、标准IO/
缓存
IO
缓存
I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是
缓存
I/O。标准IO中,用户进程中的一个完整IO分为两个阶段: (1)用户空间<------------->内核空间 (2)内核空间<------------->设备空间 三、直接IO ...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章