-
writev
鎖定
writev將多個數據存儲在一起,將駐留在兩個或更多的不連接的緩衝區中的數據一次寫出去。
writev簡介
UNIX和WINSOCK提供了不同的實現方法UNIX系統下,使用writev,可以指定一系列的緩衝區,收集要寫的數據,使可以安排數據保存在多個緩衝區中,然後同時寫出去,從而避免出現Nagle和延遲ACK算法的相互影響。
writev參數
#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變量。
- 詞條統計
-
- 瀏覽次數:次
- 編輯次數:8次歷史版本
- 最近更新: 青青的麦田year