writev

writev,将多个数据存储在一起,将驻留在两个或更多的不连接的缓冲区中的数据一次写出去。
基础资料
  • 实质:多个数据存储在一起
  • 对象:UNIX和WINSOCK
  • 特点:可以指定一系列的缓冲区
  • 简介

    正文

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

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

    #include

    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

    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变量。

    首页
    科技
    #贵族
    最新入驻
    贾科莫·普契尼
    Caroline Lufkin
    翁建宇
    相关阅读
    abort
    内容词条·762人浏览
    waitpid
    内容词条·1032人浏览
    共享库
    内容词条·3995人浏览
    sigaction
    内容词条·124人浏览
    pause函数
    内容词条·4451人浏览
    fchown
    内容词条·3064人浏览
    • 网站地图
    • |

    Copyright 2023 fuwu029.com赣ICP备2022008914号-4