关于是TransmitFile函数的使用方法

lbird 2002-11-10 04:39:06
1、WSAAsyncSelect模式下能不能使用该函数
2、当发送文件较大时,接收方应如何接收
3、谁能给出具体的代码,我不要整个程序,
只要写出传输双方跟这个调用有关的的局部代码
得到答案马上给分
...全文
781 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbird 2002-11-14
  • 打赏
  • 举报
回复
huangbeyond:
非常感谢!你能不能回答第一个问题,还有用FTP传输入速度会不会更慢
huangbeyond 2002-11-14
  • 打赏
  • 举报
回复
第一个问题:可以在WSAAsyncSelect模式下运用.

但是据我个人理解,该函数一般是由服务端提供,比如HTTP服务器等;客户端,是很少使用这个函数的.那么,WSAAsyncSelect模型绝对不是服务器的优秀选择!!

使用FTP,速度和TransmitFile相差是不大的.毕竟在现在,影响速度不是CPU和硬盘,而是网络带宽.
huangbeyond 2002-11-12
  • 打赏
  • 举报
回复
这个函数,我在"WINSOCK IO完成端口"模型里使用过.即:传送方是完成端口模型,是服务器;接收方是WSAEventSelete模型,是客户端.

从内核态来说,TransmitFile只是"ReadFile-send-ReadFile-send......"的高效封装.换句换说,当该函数运行时,接收端只需要循环地调用recv,把数据接收过来就可以了.而每一次接收的缓冲区尺寸,就是该函数的nNumberOfBytesPerSend 参数,写过网络的人都明白,这种C/S的同步是必然的.

需要注意的细节:
1.注意两边的nNumberOfBytesPerSend 值要相同;
2.服务端在执行TransmitFile前,先用一个DWORD把文件尺寸传给客户端(使用lpTransmitBuffers 参数就可以了),否则,客户端是不会知道什么才是文件传输完毕的标志(或者,可以把"连接断开"做为标志,即服务端在传输完毕之后,就关闭该SOCKET);
3.至于超大尺寸文件(几十--上百M),为保险起见,还是使用FTP吧.因为TransmitFile不支持"断点继传".
lbird 2002-11-12
  • 打赏
  • 举报
回复
icelight:
1,你的代码是否已经过测试
2,当这个文件很大时,比如有几十,上百兆时,收发双方应注意到哪些细节? 能不能详细点

icelight 2002-11-12
  • 打赏
  • 举报
回复
1.只要WSAAsyncSelect用的是面向连接的协议,就能用这个函数。
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 );
lbird 2002-11-11
  • 打赏
  • 举报
回复
没人能帮帮我吗

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧