词条 | 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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。