最近,我被分配了一个客户端/服务器项目,该项目基本上是一个聊天室,可以在其中发送和接收文件,并且我们可以使用网络摄像头。 我目前正在研究文件传输部分,在看了一些在线教程之后,我注意到它们中的大多数都使用偏移量写入缓冲区,然后将整个缓冲区写入新文件。
要复制这种代码,我设置了2个缓冲区,一个在客户端,另一个在服务器端。在服务器端,我从文件读取8192字节到缓冲区,然后将其发送到客户端,客户端将接收它,并将其添加到缓冲区。问题是,在第二次文件传输之后,它执行的每一次传输都是SOCKET_ERROR,这可能意味着有些不对劲。
服务器:
std::ifstream readFile;
readFile.open(FileName, std::ios::binary | std::ios::ate);
if (!readFile)
{
std::cout << "unable to open file" << std::endl;
}
int FileSize = readFile.tellg();
readFile.seekg(0);
int remainingBytes = 0;
uint32_t FileSize32t = (uint32_t)FileSize;
FileSize32t = htonl(FileSize32t);
send(connections[ID], (char*)&FileSize32t, sizeof(uint32_t), 0);
int sent_bytes = 0;
int offset = 0;
char data[8192];
remainingBytes = FileSize;
int i = 0;
while (i<6)
{
readFile.read(data, 8192);
if (remainingBytes < 8192)
{
sent_bytes = send(connections[ID], data+offset, remainingBytes, 0);
remainingBytes -= sent_bytes;
offset += sent_bytes;
}
else
{
sent_bytes = send(connections[ID], data+offset, 8192, 0);
if (sent_bytes == SOCKET_ERROR)
{
std::cout << "erro" << std::endl;
}
remainingBytes -= sent_bytes;
offset += sent_bytes;
std::cout <<"offset: "<< offset << std::endl;
std::cout << "Sent bytes: " << sent_bytes << std::endl;
std::cout << "remaining bytes: " << remainingBytes << std::endl;
}
i++;
}
客户:
char data[8192];
std::ofstream writeFile;
writeFile.open("Putin.jpg", std::ios::binary);
int bytesReceieved = 0;
int totalBytesReceieved = 0;
int i = 0;
while (i<6)
{
if (recvFileSize - totalBytesReceieved < 8192)
{
bytesReceieved = recv(connection, data+totalBytesReceieved, recvFileSize - totalBytesReceieved, 0);
totalBytesReceieved += bytesReceieved;
}
else
{
bytesReceieved = recv(connection, data + totalBytesReceieved, 8192, 0);
totalBytesReceieved += bytesReceieved;
std::cout << totalBytesReceieved << std::endl;
}
i++;
}
writeFile.write(data, totalBytesReceieved);
std::cout << "transferência terminada, bytes recebidos: " << totalBytesReceieved << std::endl;
writeFile.close();
请注意,这只是一个测试程序,这是我与C ++的首次互动之一。有人告诉我这可能不是从C ++开始的最佳方法,但是我需要在9月15日之前完成此任务,所以无论如何我都需要完成它。如果您发现除了我的原始问题之外的任何错误或问题,请随时指出,如果可以,请向我解释原因。
非常感谢您的帮助。