完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
文件传输协议使用户能在两个联网的计算机之间传输文件。FTP提供了一种允许客户端建立FTP控制连接并在两台FTP服务器间传输文件的机制。但在实际应用中FTP并不能完全满足要求,在一些特殊场合需要程序设计人员根据用户的要求自定义文件传输协议。 1 自定义文件传输协议 文件传输是指将文件从一台计算机上发送到另一台计算机上,传输的文件可以包括电子报表、声音、编译后的程序以及字处理程序的文档文件。 目前Internet上应用最广的文件传输协议是FTP(File Transfer Protocol)。FTP是定义如何在TCP/IP网络中进行文件传输的一个标准协议,采用Client/Server模式,由客户端发出连接请求,向服务器提交FTP命令,服务器接收到命令后,返回对命令的响应,并进行文件操作,完成后,向服务器发出解除连接请求,结束FTP 会话。 自定义文件传输协议通常情况下应该具备两大功能,即文件共享和远程文件管理功能。文件共享功能指该协议允许授权用户获取服务器指定目录的文件列表信息和下载文件。远程文件管理功能指该协议允许授权用户远程修改或删除服务器中的目录与文件和上传文件。此外,还可以根据实际需要添加其他功能。在网络协议的选择上,可以使用TCP/IP协议,也可以使用UDP协议等,或者同时使用多种网络协议。 2自定义文件传输协议的实现方法 在程序设计中实现对标准文件传输协议FTP的支持比较简单,而要支持自定义的文件传输协议则相对比较复杂。 2.1 应用程序必须提供相应的网络通讯功能,若采用UDP协议进行文件传输,代码如下。 #include #pragma comment(lib, "ws2_32.lib") #define WM_UDP_EVENT WM_USER + 100 WSADATA wsaData; SOCKET m_hUdpSocket; SOCKADDR_IN m_saUdpAddr; WSAStartup(MAKEWORD(2, 2), &wsaData); m_hUdpSocket = socket(AF_INET, SOCK_DGRAM, 0); m_saUdpAddr.sin_family = AF_INET; m_saUdpAddr.sin_port = htons(2005); m_saUdpAddr.sin_addr.s_addr = INADDR_ANY; bind(m_hUdpSocket, (LPSOCKADDR) &m_saUdpAddr, sizeof(m_saUdpAddr)); WSAAsyncSelect(m_hUdpSocket, hWnd, WM_UDP_EVENT, FD_READ); 2.2 应用程序需要根据自定义文件传输协议来解析并执行文件传输指令。指令可以由字符串组成,也可以是整型数据。使用整型数据定义文件传输指令(GET_FILE_LIST:获取文件列表信息;FILE_LIST_DATA:反馈文件列表信息)。 #define REQUEST_FILE_LIST 0x00000001L #define RESPONSION_FILE_LIST 0x00000002L struct COMMAND_HEADER { char sIdentifier[2]; // 标识符 float fVersion; // 版本号 long lCommand; // 指令 }; struct FILE_INFO { char szFileName[MAX_PATH]; // 文件名 DWORD nFileSizeHigh; // 文件长度高字节 DWORD nFileSizeLow; // 文件长度低字节 Char szTypeName[80]; // 文件类型 DWORD dwFileAttributes; // 文件属性 FILETIME ftCreationTime; // 创建时间 FILETIME ftLastWrite; // 修改时间 FILETIME ftLastAccessTime; // 访问时间 }; struct REQUEST_FILE_LIST { COMMAND_HEADER CommandHeader; char szFolderName[MAX_PATH]; }; struct RESPONSION_FILE_LIST { COMMAND_HEADER CommandHeader; FILE_INFO fiFileInfo; }; LRESULT CFileTransferView::OnUdpEvent(WPARAM wParam, LPARAM lParam) { char szReceiveData[2048]; // 接收数据 CString strIP; // IP地址 u_short nPort; // 端口号 COMMAND_HEADER* pCommmandHeader; REQUEST_FILE_LIST* pRequestFileList; RESPONSION_FILE_LIST* pResponsionFileList; switch (WSAGETSELECTEVENT(lParam)) { case FD_READ: // 获取数据、IP地址和端口号 …… pCommmandHeader = (COMMAND_HEADER*) szReceiveData; switch (pCommmandHeader-> lCommand) { case REQUEST_FILE_LIST: pRequestFileList = (REQUEST_FILE_LIST*) pCommmandHeader; GetFileList(strIP, nPort, pRequestFileList->szFolderName); break; case RESPONSION_FILE_LIST: pResponsionFileList = (RESPONSION_FILE_LIST*) pCommmandHeader; // 显示pCommandFileList->flFileList中的信息 break; } } return 0L; } BOOL GetFileList(CString sIP, u_short nPort, CString strFolderName) { HANDLE hFind; WIN32_FIND_DATA fdFindData; RESPONSION_FILE_LIST ResponsionFileList; ZeroMemory(&ResponsionFileList, sizeof(RESPONSION_FILE_LIST)); …… ResponsionFileList.CommandHeader.lCommand = RESPONSION_FILE_LIST; hFind = FindFirstFile(strFolderName, &fdFindData); if (hFind != INVALID_HANDLE_VALUE) { do { strcpy(ResponsionFileList.fiFileInfo.szFileName, fdFindData.cFileName); ResponsionFileList.fiFileInfo.dwFileAttributes = fdFindData.dwFileAttributes; if((fdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { ResponsionFileList.fiFileInfo.nFileSizeHigh = 0; ResponsionFileList.fiFileInfo.nFileSizeLow = 0; } else { ResponsionFileList.fiFileInfo.nFileSizeHigh = fdFindData.nFileSizeHigh; ResponsionFileList.fiFileInfo.nFileSizeLow = fdFindData.nFileSizeLow; } ResponsionFileList.fiFileInfo.ftLastWrite = fdFindData.ftLastWriteTime; if (!Send(sIP, nPort, (char*) & ResponsionFileList, sizeof(COMMAND_FILE_LIST))) return FALSE; } while (FindNextFile(hFind, &fdFindData)); } FindClose(hFind); return TRUE; } 2.3 关闭套接字。 if (m_hUdpSocket != INVALID_SOCKET) closesocket(m_hUdpSocket); 3 结语 FTP依赖于TCP/IP协议,同时也受限于TCP/IP协议。在一些特殊场合,可能需要利用UDP协议来进行文件传输,或者需要Internet上实现基于P2P(Peer-to-Peer)技术的文件共享功能,因此需要根据需要自定义文件传输协议。自定义文件传输协议具有很大的灵活性,可以满足不同场合的用户需要。 |
|
相关推荐
|
|
在只有一个电子负载仪的情况下,如何持续监控并记录太阳能充电板的全程充电电流?
1346 浏览 1 评论
5732 浏览 1 评论
9381 浏览 1 评论
8740 浏览 1 评论
1338 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:53 , Processed in 0.629755 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号