优化上面发送的代码的打开本地文件进行读取和读取文件内容并发送给服务器的代码
时间: 2024-04-11 19:27:04 浏览: 15
对于打开本地文件进行读取和读取文件内容并发送给服务器的代码,可以进行一些优化。可以使用std::ifstream的构造函数来打开文件,并使用std::istreambuf_iterator来读取文件内容。同时,可以使用std::copy将文件内容直接发送给服务器。
下面是优化后的代码:
```cpp
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "Failed to initialize Winsock." << std::endl;
return 1;
}
// 创建套接字
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Failed to create socket." << std::endl;
WSACleanup();
return 1;
}
// 设置服务器地址
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8888); // FTP默认端口为21
serverAddr.sin_addr.s_addr = htonl(2130706433); // 修改为实际的服务器IP地址
// 连接服务器
if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
std::cerr << "Failed to connect to server." << std::endl;
closesocket(clientSocket);
WSACleanup();
return 1;
}
std::cout << "Connected to server. Ready to send files." << std::endl;
// 发送文件名
const char* fileName = "test.txt"; // 修改为实际的文件名
send(clientSocket, fileName, strlen(fileName) + 1, 0);
std::cout << "Sending file: " << fileName << std::endl;
// 打开本地文件进行读取
std::ifstream inputFile(fileName, std::ios::binary);
if (!inputFile) {
std::cerr << "Failed to open file for reading." << std::endl;
closesocket(clientSocket);
WSACleanup();
return 1;
}
// 读取文件内容并发送给服务器
std::istreambuf_iterator<char> inputIterator(inputFile);
std::istreambuf_iterator<char> endIterator;
std::copy(inputIterator, endIterator, std::ostreambuf_iterator<char>(std::cout));
inputFile.close();
std::cout << "File sent successfully." << std::endl;
// 关闭套接字和清理资源
closesocket(clientSocket);
WSACleanup();
return 0;
}
```
这个优化后的代码使用了std::ifstream的构造函数来打开文件,第二个参数指定了打开文件的模式为二进制模式(std::ios::binary)。然后,使用std::istreambuf_iterator来读取文件内容,将读取的内容通过std::copy直接发送给服务器。
需要注意的是,std::copy的第三个参数是一个std::ostreambuf_iterator,它将输出流转换为一个迭代器,用于向输出流写入数据。在这个代码中,我们使用std::cout作为输出流,这样可以将读取的文件内容输出到控制台。你可以根据需要将std::cout替换为send函数,将文件内容发送给服务器。
另外,对于文件读取和发送过程中的错误处理和异常情况,你可以根据实际需求进行扩展和优化。