DWORD SendFileByFileMapping(const std::wstring& file_path, SOCKET s)
{
DWORD result = -1;
DWORD error_code = 0;
if (file_path.empty() || s == INVALID_SOCKET)
{
return result;
}
HANDLE hFile = ::CreateFile(file_path.c_str(), FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return result;
}
DWORD file_size = ::GetFileSize(hFile, NULL);
//use file map
HANDLE hFileMapping = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (!hFileMapping)
{
error_code = GetLastError();
return result;
}
const char* pMemMapping = (const char*)MapViewOfFile(hFileMapping, FILE_MAP_READ, 0 ,0 ,0);
if (pMemMapping)
{
error_code = GetLastError();
CloseHandle(hFileMapping);
CloseHandle(hFile);
return error_code;
}
int left_size, index_size, ret;
ret = send(s, (char*)&file_size, sizeof(DWORD), 0);
if (ret ==SOCKET_ERROR)
{
UnmapViewOfFile(pMemMapping);
CloseHandle(hFileMapping);
CloseHandle(hFile);
error_code = GetLastError();
return error_code;
}
left_size = file_size;
index_size = 0;
while (left_size > 0)
{
ret = send(s, &pMemMapping[index_size], left_size, 0 );
if (SOCKET_ERROR == ret)
{
error_code = GetLastError;
break;
}
index_size+=ret;
left_size-=ret;
}
UnmapViewOfFile(pMemMapping);
CloseHandle(hFileMapping);
CloseHandle(hFile);
error_code = 0;
return error_code;
}
利用文件映射发送文件
最新推荐文章于 2023-02-26 23:20:23 发布