writev用法

UNIXWINSOCK提供了不同的实现方法UNIX系统下,使用writev,可以指定一系列的缓冲区,收集要写的数据,使可以安排数据保存在多个缓冲区中,然后同时写出去,从而避免出现Nagle和延迟ACK算法的相互影响。

参数

编辑
#include <sys/uio.h>
ssize_t writev( int fd, const struct iovec *iov, int cnt );
ssize_t  readv( int fd, const struct iovec *iov, int cnt );
返回值:传输字节数,出错时返回-1.
参数说明:
iov是一组iovec结构的 指针,iovec结构如下:
struct iovec {
char *iov_base; /*基本地址 指针,指向缓冲区*/
size_t iov_len; /*指定缓冲区长度*/
};
说明:这个定义取自 FreeBSD系统,许多系统现在定义基本地址指针为void *iov_base;
cnt是 数组中iovec结构的个数,即分开缓冲区的个数。
这两个函数可以用于 套接字及任何类型的 文件描述符
示例:
#include <sys/uio.h>
int main( int argc, char **argv )
{
SOCKET s;
int n;
char buf[ 128 ];
struct iovec iov[ 2 ];
INIT();
/*socket部分略去*/
/*writev调用指定iov参数指向的结构为const 变量,即iov 数组不会被writev调用改变,程序可以在循环外设置结构的大多数域*/
iov[ 0 ].iov_base = ( char * )&n;
iov[ 0 ].iov_len = sizeof( n );
iov[ 1 ].iov_base = buf;
while ( fgets( buf, sizeof( buf ), stdin ) != NULL )
{
iov[ 1 ].iov_len = strlen( buf );
n = htonl( iov[ 1 ].iov_len );
if ( writev( s, iov, 2 ) < 0 )
error( 1, errno, "writev failure" );
}
EXIT( 0 );
}
程序说明,用第二项读取输入的数据,第一行记录读取数据的长度,并将其转换为网络 字节序,将这两项同时通过 套接字发送至对等方。
Winsock中类似函数
#include <winsock2.h>
int WSAAPI WSAsend( SOCKET s, LPWSABUF buf, DWORD cnt, LPDWORD sent, DWORD flags, LPWSAOVERLAPPED ov1, LPWSAOVERLAPPED_COMPLETION_ROUTINE func );
返回值:成功返回0,否则返回 SOCKET_ERROR
最后两个参数用于重叠I/O,buf指向WSABUF数据结构,作用和writev中的iovec结构相似
typedef struct _WSAVUF {
u_long len; /*buffer 长度*/
char FAR* buf; /*指向buffer的 指针*/
} WSABUF, FAR* LPWSABUF;
如果调用成功返回,参数sent就指向所包含发送字节数目的一个DWORD 变量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值