使用 C++ 通过 TCP 发送文件,接收错误的大小
Sending files over TCP using C++, recving wrong size
我是套接字编程的新手,我正在尝试通过 TCP 连接发送但几乎没有错误。
这是我的代码
FILE* File;
char* Buffer;
unsigned long Size;
File = fopen("C:\test.zip", "rb");
if (!File)
{
printf("Error while readaing the file\n");
return;
}
// file size 1
fseek(File, 0, SEEK_END);
Size = ftell(File);
fseek(File, 0, SEEK_SET);
Buffer = new char[Size];
fread(Buffer, Size, 1, File);
char cSize[MAX_PATH];
sprintf(cSize, "%i", Size);
cout << "MAX PATH " << MAX_PATH<<endl;
cout << "cSize: " << cSize << endl;
fclose(File);
`
所以这是为了找到我的文件的大小。我在这里从其他问题中尝试的大部分代码都没有解决我的问题。
'
我的发送和接收:
unsigned long filechunk = 1025;
unsigned long byteSent = 0;
unsigned long bytesToSend = 0;
send(Sub, cSize, MAX_PATH, 0); // File size to client
while (byteSent < Size) {
if ((Size - byteSent) >= filechunk) {
bytesToSend = filechunk;
}
else {
bytesToSend = Size - byteSent;
}
if (send(Sub, Buffer + byteSent, bytesToSend, 0)) {
std::cout << "Sent: ";
}
byteSent += bytesToSend;
std::cout << "Size : "<<Size<<" BytesSent : "<<byteSent<<" Bytes to send: " << bytesToSend << std::endl;
system("pause");
在客户端:
int Size;
char* Filesize = new char[5000000]; // is there a better way? my sfiles size are unknown but at least 50mb
if (recv(Socket, Filesize, 5000000, 0)) // File size
{
Size = atoi((const char*)Filesize);
printf("File size: %d\n", Size);
}
char* Buffer = new char[Size];
FILE* File;
File = fopen("test.zip", "wb"); //start copying from the server, creating the file first.
std::string convert;
long conv;
std::cout << "Size: " << Size << std::endl;
int total=Size;
int byteRecv = 0;
int recvCheck;
int bytes = 1025;
//getting the file
while (byteRecv < Size ) {
recvCheck = recv(Socket, Buffer, bytes, 0);
if (recvCheck >0) // File
{
fwrite(Buffer, 1, byteRecv, File);
std::cout << "Recieved:" << byteRecv << std::endl;
Size -= byteRecv;
byteRecv += byteRecv;
std::cout << "Error: " << WSAGetLastError();
}
else {
std::cout << "Error: " << WSAGetLastError();
total += 1; // the loop often get into infinit loop so i force it in case of this error.
if (total > 3) {
break;
}
}
}
fclose(File);
所以,我知道它不是很有效,我不确定是否有类似的问题,因为我已经在这里挖掘了几个星期了。
-有没有更好的方法可以制作 char*[]?因为我还不知道我要发送的文件的大小。
- ftell() 和 sifeof() 的工作方式相同吗?
- 当我检查从服务器接收到的大小时,它是错误的。例如:服务器文件:32633513,接收大小:3263
-我从其他问题中提取的大部分代码并将其组合在一起。如果您看到任何不需要的内容,请告诉我,以便我记录下来。
有很多错误,但最初可能会纠正您的问题:
在客户端替换(你正在减少字节总数和接收到的错误值):
Size -= byteRecv;
byteRecv += byteRecv;
与:
byteRecv += recvCheck; // actualizes the count of received bytes
另一个问题是您的缓冲区大小。永远不要试图在内存中获取整个文件,这通常是无稽之谈;文件通常是逐块管理的。由于您在每个循环中最多读取 1025 个字节,因此只使用大小为 1025 的缓冲区,您不需要更多。阅读和写作也一样...
我是套接字编程的新手,我正在尝试通过 TCP 连接发送但几乎没有错误。
这是我的代码
FILE* File;
char* Buffer;
unsigned long Size;
File = fopen("C:\test.zip", "rb");
if (!File)
{
printf("Error while readaing the file\n");
return;
}
// file size 1
fseek(File, 0, SEEK_END);
Size = ftell(File);
fseek(File, 0, SEEK_SET);
Buffer = new char[Size];
fread(Buffer, Size, 1, File);
char cSize[MAX_PATH];
sprintf(cSize, "%i", Size);
cout << "MAX PATH " << MAX_PATH<<endl;
cout << "cSize: " << cSize << endl;
fclose(File);
` 所以这是为了找到我的文件的大小。我在这里从其他问题中尝试的大部分代码都没有解决我的问题。 ' 我的发送和接收:
unsigned long filechunk = 1025;
unsigned long byteSent = 0;
unsigned long bytesToSend = 0;
send(Sub, cSize, MAX_PATH, 0); // File size to client
while (byteSent < Size) {
if ((Size - byteSent) >= filechunk) {
bytesToSend = filechunk;
}
else {
bytesToSend = Size - byteSent;
}
if (send(Sub, Buffer + byteSent, bytesToSend, 0)) {
std::cout << "Sent: ";
}
byteSent += bytesToSend;
std::cout << "Size : "<<Size<<" BytesSent : "<<byteSent<<" Bytes to send: " << bytesToSend << std::endl;
system("pause");
在客户端:
int Size;
char* Filesize = new char[5000000]; // is there a better way? my sfiles size are unknown but at least 50mb
if (recv(Socket, Filesize, 5000000, 0)) // File size
{
Size = atoi((const char*)Filesize);
printf("File size: %d\n", Size);
}
char* Buffer = new char[Size];
FILE* File;
File = fopen("test.zip", "wb"); //start copying from the server, creating the file first.
std::string convert;
long conv;
std::cout << "Size: " << Size << std::endl;
int total=Size;
int byteRecv = 0;
int recvCheck;
int bytes = 1025;
//getting the file
while (byteRecv < Size ) {
recvCheck = recv(Socket, Buffer, bytes, 0);
if (recvCheck >0) // File
{
fwrite(Buffer, 1, byteRecv, File);
std::cout << "Recieved:" << byteRecv << std::endl;
Size -= byteRecv;
byteRecv += byteRecv;
std::cout << "Error: " << WSAGetLastError();
}
else {
std::cout << "Error: " << WSAGetLastError();
total += 1; // the loop often get into infinit loop so i force it in case of this error.
if (total > 3) {
break;
}
}
}
fclose(File);
所以,我知道它不是很有效,我不确定是否有类似的问题,因为我已经在这里挖掘了几个星期了。
-有没有更好的方法可以制作 char*[]?因为我还不知道我要发送的文件的大小。 - ftell() 和 sifeof() 的工作方式相同吗? - 当我检查从服务器接收到的大小时,它是错误的。例如:服务器文件:32633513,接收大小:3263 -我从其他问题中提取的大部分代码并将其组合在一起。如果您看到任何不需要的内容,请告诉我,以便我记录下来。
有很多错误,但最初可能会纠正您的问题:
在客户端替换(你正在减少字节总数和接收到的错误值):
Size -= byteRecv;
byteRecv += byteRecv;
与:
byteRecv += recvCheck; // actualizes the count of received bytes
另一个问题是您的缓冲区大小。永远不要试图在内存中获取整个文件,这通常是无稽之谈;文件通常是逐块管理的。由于您在每个循环中最多读取 1025 个字节,因此只使用大小为 1025 的缓冲区,您不需要更多。阅读和写作也一样...