writev用法

来源:互联网 发布:淘宝代销下单好吗 编辑:程序博客网 时间:2024/05/23 11:50
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变量。
0 0
原创粉丝点击