01 | BOOL TransmitFile( |
02 | SOCKET hSocket, |
03 | HANDLE hFile, |
04 | DWORD nNumberOfBytesToWrite, |
05 | DWORD nNumberOfBytesPerSend, |
06 | LPOVERLAPPED lpOverlapped, |
07 | LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, |
08 | DWORD dwFlags |
09 | ); |
10 | 参数: |
11 | hSocket |
12 | 面向连接的SOCKET句柄。 |
13 | hFile |
14 | 已打开的文件句柄 |
15 | nNumberOfBytesToWrite |
16 | 要传送的字节数。0值表示传送整个文件。 |
17 | nNumberOfBytesPerSend |
18 | 每次传送的数据块的大小。0值表示使用SOCKET LAYER的默认值。 |
19 | lpOverlapped |
20 | 指向OVERLAPPED结构的指针。NULL值表示不开启overlapped I/O模式。 |
21 | lpTransmitBuffers |
22 | 指向TRANSMIT_FILE_BUFFERS结构指针。NULL值表示仅仅传输文件。 |
23 | dwFlags |
24 | 有三个值可选TF_DISCONNECT TF_REUSE_SOCKET TF_WRITE_BEHIND |
25 | 给出接收端的代码: |
26 | SOCKET socketListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); |
27 | bind(socketListen,NULL,0); |
28 | listen(socketListen,SOMAXCONN); |
29 | SOCKET socketRead = accept(socketListen,NULL,0); |
30 | char sz[1000000]; |
31 | while ( true ) |
32 | { |
33 | if (recv(socketRead,sz, strlen (sz))==SOCKET_ERROR ) |
34 | break ; |
35 | //写入文件 |
36 | } |
37 | 发送端代码 |
38 | connect... |
39 | TransmitFile(hSocket,hFile,0,0,0,NULL,TF_DISCONNECT ); |
40 | //使用例子 |
41 | //发送端 |
42 | //发送文件 |
43 | HANDLE hFile = CreateFile(lpszFilePath,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); |
44 | TransmitFile(m_Socket,hFile,0,TRANS_FILE_LENGTH,NULL,NULL,TF_DISCONNECT); |
45 | CloseHandle(hFile); |
46 | //接收端 |
47 | ULONG lReadSize = 0; |
48 | char szInfo[TRANS_FILE_LENGTH] = {0}; |
49 | HANDLE hFile = CreateFile(lpszFilePah,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); |
50 | while (hFile != INVALID_HANDLE_VALUE) |
51 | { |
52 | int iSize = recv(m_Socket,szInfo,TRANS_FILE_LENGTH,0); |
53 | if (iSize==SOCKET_ERROR||iSize==0) |
54 | { |
55 | CloseHandle(hFile); |
56 | break ; |
57 | } |
58 | else if (iSize<TRANS_FILE_LENGTH) |
59 | { |
60 | WriteFile(hFile,szInfo,iSize,&lReadSize,NULL); |
61 | CloseHandle(hFile); |
62 | break ; |
63 | } |
64 | //写入文件 |
65 | WriteFile(hFile,szInfo,iSize,&lReadSize,NULL); |
66 | } |