请输入您要查询的百科知识:

 

词条 TransmitFile
释义

功能说明:TransmitFile 是一个扩展的 API,它允许在套接字连接上发送一个打开的文件。这使得应用程序可以避免亲自打开文件,重复地在文件执行读入操作,再将读入的那块数据写入套接字。相反,已打开的文件的句柄是各套接字连接一起给出的,在套接字上,文件数据的读入和发送都在核心模式下进行。这就避免了亲自执行文件读入时必须的多重内核变换。

函数原型:BOOL

PASCAL FAR

TransmitFile(

IN SOCKET hSocket,

IN HANDLE hFile,

IN DWORD nNumberOfBytesToWrite,

IN DWORD nNumberOfBytesPerSend,

IN LPOVERLAPPED lpOverlapped,

IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,

IN DWORD dwReserved);

参数说明:第一个参数是连接套接字。hFile 参数是一个打开文件的句柄,这个参数可以是NULL,此时将传输 lpTransmitBuffer。当然,使用TransmitFile 来发送仅用于存储的缓冲区没有什么意义。nNumberOfBytesToWrite 参数是从文件发送的字节数,取值为零时表示发送整个文件。nNumberOfBytesPerSend 参数指明每个发送操作中所发送的每个数据块的大小,如果将其指定为零,系统就使用默认的发送大小。Windows NT 工作站上默认的发送大小是 4K,南昌在Windows服务器上是64K。lpOVERLAPPED 结构可有可无,但得注意,如果忽略掉这个结构,文件传输将从当前文件指针的位置开始。lpTransmitBuffers 参数是一个 TRANSMIT_FILE_BUFFERS 结构,包含存储缓冲区,这个存储缓冲区将在文件被传输之前或之后传输。lpTransmitBuffers 参数是一个可选参数。最后一个参数是可选标志,它将影响文件操作的行为。

TransmitFile标志

标志 意义

TF_DISCONNECT  在 TransmitFile 操作进入等待队列后,发起一个传输层断开动作。

TF_REUSE_SOCKET 为套接字句柄的重新使用作好准备。在 TransmitFile 完成后,套接字句柄可用作 AcceptEx 中的客户机套接字,只有当 TF_DISCONNECT 也被指定时,这个标志才会生效。

TF_USE_DEFAULT_WORKER 指示文件传输使用系统的默认线程,这对大型文件的发送很有用。

TF_USE_SYSTEM_THREAD  这个选项也指示 TransmitFile 操作使用系统默认线程来执行。

TF_USE_KERNEL_APC 指明应该使用核心异步过程调用来处理 TransmitFile 请求,而不用工作器线程。注意,如果应用程序处于等待状态(尽管不一定非得是警觉等待状态),则核心APC只能由应用程序安排时间来运行。

TF_WRITE_BEHIND  指明 TransmitFile 请求应该立即返回,即使远端可能还没有确认已收到数据。这个标志不能与 TF_DISCONNECT 或 TF_REUSE_SOCKET 标志同时使用。

对基于文件的I/O(如WEB服务器)来说,TransmitFile 函数很有用。另外它的一个有用的特性,是能够指定标志 TF_DISCONNECT 和 TF_REUSE_SOCKET。如果两个标志都指定,一旦发送操作完成,文件和(或)存储缓冲区都将被传输,套接字也将断开。同时,传递到API的套接字句柄将被用作AcceptEx中的客户机套接字,或用作AcceptEx中的连接套接字。因为套接字创建耗费非常之大,所以这一个极其有用。服务器可以用AcceptEx来处理客户机连接,然后用 TransmitFile 发送数据(指定上述标志),过后套接字句柄可以在随后对的AcceptEx 调用中使用。

注意,可以使用空文件句柄及空 lpTransmitBuffers 来调用 TransmitFile ,不过全然要指定 TF_DISCONNECT 和 TF_REUSE_SOCKET。这个调用不会发送任何数据,只是会让套接字在 AcceptEx 中重新使用。对于不支持 DisconnectEx API的平台来说,这是一个很好的变通方法。最后,Windows NT 4.0及后期版本均支持 TransmitFile 函数。同时,因为 TransmitFile 着重于服务器应用程序,因此只有在 Window 的服务器版本上,其功能才能得到完全发挥。对于家庭版或专业版,在任何时候,只可以有两个未完成的 TransmitFile(或 TransmitPackets)调用。如果超过这个数目,则多余的将排除等候,直到正在执行的调用结束之后,才会被处理。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/1 13:00:47