请输入您要查询的百科知识:

 

词条 writev
释义

将多个数据存储在一起,将驻留在两个或更多的不连接的缓冲区中的数据一次写出去。

UNIX和WINSOCK提供了不同的实现方法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变量。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/4 19:32:54