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部分略去*/
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變數。