【发布时间】:2020-12-19 19:19:47
【问题描述】:
这是我的非重叠套接字的接收文件函数。
HANDLE recvfile = CreateFile(fileinfo[0], FILE_APPEND_DATA, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (recvfile == INVALID_HANDLE_VALUE) {
sockprintf(sockfd, "[Error Creating File] : %ld", GetLastError());
}
else {
memset(recvbuf, '\0', BUFFER); // Clear main buffer
int total = 0; // Total bytes received
// set_blocking_mode(sockfd, FALSE);
do{ // IF Total is equal to expected bytes. Break the loop, And stop receiving.
fsize = recv(sockfd, recvbuf, BUFFER, 0); // Receive file
if (fsize == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)
{
connected = FALSE;
printf("[X] Connection interrupted while receiving file %s for %s size.", fileinfo[0], fileinfo[1]);
}
write = WriteFile(recvfile, recvbuf, fsize, &dwBytesWritten, NULL); // Write file data to file
total += fsize; // Add number of bytes received to total.
} while(total != expected);
// set_blocking_mode(sockfd, TRUE);
if (write == FALSE)
{
sockprintf(sockfd, "[Error Writing file %s of %s size] Error : %ld.", fileinfo[0], fileinfo[1], GetLastError());
}
else {
sockprintf(sockfd, "\n[ Received File : %s ]\n[ File Size : %s bytes ]\n[ Bytes written : %ld ]\n", fileinfo[0], fileinfo[1], dwBytesWritten);
}
CloseHandle(recvfile);
}
这很好用!文件传输几乎是即时的,没有错误或损坏的缓冲区。 我在 Visual Studio 2019 上。问题是,当我编译可执行文件并将其移动到测试虚拟机时。程序崩溃。在 Windows 10 和 Windows 7 上测试。
在 do while 循环中发生崩溃。该程序不会摆脱它。我尝试使用 msvc(最新)以及 mingw-w64 和 tdm gcc 进行编译。错误是一样的。 该代码仅适用于我自己的机器,它不适用于任何其他机器。
【问题讨论】:
-
Err... 为什么要设置非阻塞?如果返回 WSAEWOULDBLOCK 错误会发生什么?
-
} while(total != expected);似乎雄心勃勃,但没有显示它们的更新位置。 -
@MartinJames 更正,我忘了补充,非阻塞设置为仅测试。我应该更新问题。
-
程序为什么打不出来?你应该能找到。
-
@coderman 也许你应该在每次循环运行时打印出 fsize 和 total 和 expected,然后你就可以看到为什么循环还在运行?