【发布时间】:2022-01-07 09:45:22
【问题描述】:
我在使用 TCP 向下载的服务器发送文件时遇到了一点问题。我花了几个小时找出问题所在,但仍然找不到它不起作用的原因。
主要问题是当我尝试发送文件时。程序获得了我的文件的字节数也读取了文件并循环通过条件,但它有时只发送文件。当我通过调试器运行它时,程序总是发送所有文件。当我使用 sleep() 1 秒时,问题也消失了。
#include <iostream>
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
#include <windows.h>
int main()
{
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
SOCKET SendSocket;
SendSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (SendSocket < 0) {
perror("Error at socket: ");
return 1;
}
struct sockaddr_in myAddr;
memset(&myAddr, '\0', sizeof myAddr);
myAddr.sin_family = AF_INET; //IP4
myAddr.sin_port = htons(2000);
inet_pton(AF_INET, "127.0.0.1", &(myAddr.sin_addr));
memset(myAddr.sin_zero, '\0', sizeof myAddr.sin_zero);
if (connect(SendSocket, (struct sockaddr*)&myAddr, sizeof(myAddr)) < 0)
{
perror("Error at connect: ");
return 1;
}
char buffer[512];
const char fileName[] = "test.txt";
FILE* fd;
if (errno_t a = fopen_s(&fd, fileName, "rb") != 0) {
perror("File not opened:");
return 1;
}
size_t bytes_read = 0;
size_t test = 0;
while (!feof(fd)) {
do {
if ((bytes_read = fread(buffer, 1, sizeof(buffer), fd)) < 0)
{
std::cout << "while error";
break;
}
else
{
//Sleep(1000);
if ((test = send(SendSocket, buffer, bytes_read, 0)) < 0) {
perror("Error send");
return 1;
}
//std::cout << "while send" << std::endl;
}
} while (test != bytes_read);
}
fclose(fd);
WSACleanup(); //clinap
system("PAUSE");
}
【问题讨论】:
-
可能与您当前的问题无关,但很重要:Why is “while ( !feof (file) )” always wrong?