writev

writev,將多個數據存儲在一起,將駐留在兩個或更多的不連線的緩衝區中的數據一次寫出去。

將多個數據存儲在一起,將駐留在兩個或更多的不連線的緩衝區中的數據一次寫出去。
UNIXWINSOCK提供了不同的實現方法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&#91; 128 &#93;;
struct iovec iov&#91; 2 &#93;;
INIT();
/*socket部分略去*/
/*writev調用指定iov參數指向的結構為const變數,即iov數組不會被writev調用改變,程式可以在循環外設定結構的大多數域*/
iov&#91; 0 &#93;.iov_base = ( char * )&n;
iov&#91; 0 &#93;.iov_len = sizeof( n );
iov&#91; 1 &#93;.iov_base = buf;
while ( fgets( buf, sizeof( buf ), stdin ) != NULL )
{
iov&#91; 1 &#93;.iov_len = strlen( buf );
n = htonl( iov&#91; 1 &#93;.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變數。

相關詞條

相關搜尋

熱門詞條

聯絡我們