在网络程序中尽可能使用大规模的写操作
2012-08-17 20:47
190 查看
提出此建议主要有两个原因:
(1)对于write(),send()等写函数,每次调用这些函数时会有一定的开销。
(2)Nagle算法的影响。
由于最小的TCP报文是40字节(没包括数据),一个报文发送一个字节与发送多个字节,相比之下,发送一个字节的开销会大很多。
而Nagle算法通过减少必须发送包的个数来增加网络软件系统的效率。在默认情况下,socket程序中是启用Nagle算法来提高网络效率,
但也有一些程序需要禁用Nagle算法(通过setsockopt函数)。一般来说大部分应用程序是不需要关闭Nagle算法的。
可通过将写操作合并来实现大规模的写操作。
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
返回值:传输的字节,出错时返回-1
第一个参数是文件描述符,第二参数是struct iovec结构体指针,第三个参数是缓冲区的数量。
struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes to transfer */
};
注:无论readv或writev程序中,都必须指明 iov_len的大小。
windows下也有类似的函数:
#include <winsock2.h>
int WSASend (SOCKET s,LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent,
DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
(1)对于write(),send()等写函数,每次调用这些函数时会有一定的开销。
(2)Nagle算法的影响。
由于最小的TCP报文是40字节(没包括数据),一个报文发送一个字节与发送多个字节,相比之下,发送一个字节的开销会大很多。
而Nagle算法通过减少必须发送包的个数来增加网络软件系统的效率。在默认情况下,socket程序中是启用Nagle算法来提高网络效率,
但也有一些程序需要禁用Nagle算法(通过setsockopt函数)。一般来说大部分应用程序是不需要关闭Nagle算法的。
可通过将写操作合并来实现大规模的写操作。
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
返回值:传输的字节,出错时返回-1
第一个参数是文件描述符,第二参数是struct iovec结构体指针,第三个参数是缓冲区的数量。
struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes to transfer */
};
注:无论readv或writev程序中,都必须指明 iov_len的大小。
windows下也有类似的函数:
#include <winsock2.h>
int WSASend (SOCKET s,LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent,
DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
相关文章推荐
- 微信小程序使用request网络请求操作实例
- Python程序中用csv模块来操作csv文件的基本使用教程
- [C# 开发技巧系列]使用C#操作Word和Excel程序
- 使用事件驱动模型实现高效稳定的网络服务器程序
- 程序中关于平均数的使用,我们有时候要非常谨慎,它并不是简单的相除操作!
- 初始化 Microsoft Visual SourceSafe 源代码管理提供程序时失败。您无法使用此提供程序执行源代码管理操作。”
- Windows 防火墙无法运行-“由于另一个程序或正在运行的服务可能正在使用网络地
- 操作select的jquery插件 注意:使用时请保持JS文件的编码和你程序的编码一致...
- [转载]DrawMe - 使用WPF/WCF创建的网络白板聊天程序
- android中网络操作使用总结(http)
- 最简单的使用程序进行网络链接测试
- VB中使用WinSock控件编写网络程序
- 使用Java操作ElasticSearch1.7程序
- 【转】使用python编写网络通信程序
- IOS网络操作-使用Alamofire和ObjectMapper处理JSON转对象
- 使用C#实现基于TCP和UDP协议的网络通信程序的基本示例
- Linux网络编程--使用epoll,共享内存技术实现高性能的聊天室程序
- 使用DotNetty编写跨平台网络通信程序
- 使用.NET程序操作已打开的excel文件
- 使用事件驱动模型实现高效稳定的网络服务器程序