gpt4 book ai didi

c++ - 用c++设计一个文件传输协议(protocol)

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:35 27 4
gpt4 key购买 nike

<分区>

我需要用 C++ 编写一个简单的文件传输协议(protocol)来将文件从客户端上传或下载到服务器。现在我的客户端和服务器应用程序都是全能脚本。我想模块化类/方法中的所有内容,以便以后可以更轻松地修改内容。

要上传文件,我需要发送文件的用户名(虽然没有验证)、文件名、文件大小和文件内容。这是我在客户端的内容:

int sendFile(string fileName, SOCKET s) {
ifstream file;
int ibytesent;
int size;
char fileSize[packetSize];

// Open file, set get pointer at end of file
file.open (fileName.c_str(), ios::binary | ios::ate);

// Get file size and pass it to buffer
size = (int) file.tellg();

//itoa(size, fileSize, packetSize);
sprintf(fileSize, "%d", size);

// Set pointer to beginning
file.seekg(0, ios::beg);

// Send file size
if (send(s, fileSize, packetSize, 0) == SOCKET_ERROR) {
throw "Send failed\n";
}

cout << "Size sent: " << size;

// Buffer the file Name
char fileNameBuffer[packetSize];

sprintf(fileNameBuffer, fileName.c_str());

// Send the file name
if (send(s, fileNameBuffer, packetSize, 0) == SOCKET_ERROR) {
throw "Send failed\n";
}

cout << "File name sent: " << fileName << endl;

char buf[packetSize];
ibytesent = 0;
// Loop until the whole file is sent
while(file.good()) {
// Read next packetSize bytes into buf
file.read(buf, packetSize);

// Send the read data
ibytesent += send(s, buf, packetSize, 0);

if (ibytessent == SOCKET_ERROR) {
throw "Send failed\n";
}
}

cout << "File sent.\n";
//wait for reception of server response.
ibytesrecv=0;
/*
if((ibytesrecv = recv(s,szbuffer,128,0)) == SOCKET_ERROR)
throw "Receive failed\n";
else
cout << "File received.";
*/
file.close();

return 1;
}

然后有一个 main() 方法,它打开一个套接字并连接到服务器。我的问题实际上是关于如何设计/实现适当的文件传输协议(protocol)。什么是好的结构呢?我还想知道您对如何将文件拆分(和发送)到数据包结构而不是我现在这样做的方式的看法。我不一定需要代码,但需要将关注点分离到这个类和那个类等中。

请不要推荐已经存在的协议(protocol),因为这不是本练习的重点。

谢谢

编辑 我发现了一些与我在这里寻找的东西类似的东西:http://www.eventhelix.com/realtimemantra/PatternCatalog/protocol_layer.htm

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com