TransmitFile使用(发送文件)

55 篇文章 0 订阅
37 篇文章 0 订阅


TransmitFile使用(发送文件)

 


BOOL TransmitFile(

  SOCKET hSocket,                            

  HANDLE hFile,                              

  DWORD nNumberOfBytesToWrite,               

  DWORD nNumberOfBytesPerSend,               

  LPOVERLAPPED lpOverlapped,                 

  LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, 

  DWORD dwFlags                              

);

参数:

hSocket

面向连接的SOCKET句柄。

hFile

已打开的文件句柄

nNumberOfBytesToWrite

要传送的字节数。0值表示传送整个文件。

nNumberOfBytesPerSend

每次传送的数据块的大小。0值表示使用SOCKET LAYER的默认值。

lpOverlapped

指向OVERLAPPED结构的指针。NULL值表示不开启overlapped I/O模式。

lpTransmitBuffers

指向TRANSMIT_FILE_BUFFERS结构指针。NULL值表示仅仅传输文件。

dwFlags

有三个值可选TF_DISCONNECT TF_REUSE_SOCKET TF_WRITE_BEHIND

给出接收端的代码:

SOCKET socketListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

bind(socketListen,NULL,0);

listen(socketListen,SOMAXCONN);

SOCKET socketRead = accept(socketListen,NULL,0);

char sz[1000000];

while(true)

{

  if(recv(socketRead,sz,strlen(sz))==SOCKET_ERROR )

     break;

  //写入文件

}

发送端代码

connect...

TransmitFile(hSocket,hFile,0,0,0,NULL,TF_DISCONNECT );

//使用例子

//发送端

//发送文件

HANDLE hFile = CreateFile(lpszFilePath,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

TransmitFile(m_Socket,hFile,0,TRANS_FILE_LENGTH,NULL,NULL,TF_DISCONNECT);

CloseHandle(hFile);

//接收端

ULONG lReadSize = 0;

char szInfo[TRANS_FILE_LENGTH] = {0};

HANDLE hFile = CreateFile(lpszFilePah,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);

while (hFile != INVALID_HANDLE_VALUE)

{

  int iSize = recv(m_Socket,szInfo,TRANS_FILE_LENGTH,0);

  if(iSize==SOCKET_ERROR||iSize==0)

  {

   CloseHandle(hFile);

   break;  

  }

  else if(iSize<TRANS_FILE_LENGTH)

  {

   WriteFile(hFile,szInfo,iSize,&lReadSize,NULL);

   CloseHandle(hFile);

   break;

  }

  //写入文件

  WriteFile(hFile,szInfo,iSize,&lReadSize,NULL);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值