#include tcharh#include winsock2h #include stringh #include Ws2tcpiph#include iostream#includeioh#pragma commentlibws2_32lib#define BUFFER_SIZE 2048 #define FILE_NAME_MAX_SIZE 512 using namespace s
#include <tchar.h>
#include <winsock2.h>
#include <string.h>
#include <Ws2tcpip.h>
#include
#define BUFFER_SIZE 2048 #define FILE_NAME_MAX_SIZE 512
using namespace std; string home = "server_home/"; string receiveData(SOCKET client_socket) { char buffer[BUFFER_SIZE]; memset(buffer, 0, BUFFER_SIZE); if (recv(client_socket, buffer, BUFFER_SIZE, 0) < 0) { perror("Error: Failed to receive data from client:\n"); return ""; } return buffer; }
bool sendData(SOCKET client_socket, const string& data) { if (send(client_socket, data.c_str(), data.length(), 0) < 0) { perror("Error: Failed to send data:\n"); return false; } return true; }
void uploadFile(SOCKET client_socket) { string file_name = receiveData(client_socket); if (file_name.empty()) { return; }
string stateNum = receiveData(client_socket);
if (stateNum.empty())
{
return;
}
if (stateNum == "1")
{
cout << "Error: File name not found in client!" << endl;
return;
}
if (!sendData(client_socket, "1"))
{
return;
}
string file_path = home + file_name;
FILE* fp;
if (fopen_s(&fp, file_path.c_str(), "wb") != 0)
{
cout << "Failed to open file!" << endl;
return;
}
cout << "Receiving file..." << endl;
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
int length = 0;
while ((length = recv(client_socket, buffer, BUFFER_SIZE, 0)) > 0)
{
if (fwrite(buffer, sizeof(char), length, fp) < length)
{
cout << "Failed to write file!" << endl;
break;
}
memset(buffer, 0, BUFFER_SIZE);
}
cout << "File received successfully!" << endl;
fclose(fp);
}
void downloadFile(SOCKET client_socket) { string file_name = receiveData(client_socket); if (file_name.empty()) { return; }
string file_path = home + file_name;
FILE* fp;
if (fopen_s(&fp, file_path.c_str(), "rb") != 0)
{
cout << "Error: File not found!" << endl;
sendData(client_socket, "1");
return;
}
else
{
sendData(client_socket, "2");
}
cout << "Server starts transferring file!" << endl;
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
int length = 0;
while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
{
if (send(client_socket, buffer, length, 0) < 0)
{
cout << "Error: Failed to transfer file!" << endl;
break;
}
memset(buffer, 0, BUFFER_SIZE);
}
fclose(fp);
cout << "File transferred successfully!" << endl;
}
void listFiles(SOCKET client_socket) { string path = "C:\Users\72797\source\repos\计算机网络\Debug\server_home\"; long hFile = 0; struct _finddata_t fileinfo; string p; if ((hFile = _findfirst(p.assign(path).append("*").c_str(), &fileinfo)) != -1) { do { p.assign(fileinfo.name); if (p == "." || p == "..") continue;
if (!sendData(client_socket, p))
{
break;
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
int main(int argc, char* argv[]) { WORD sockVersion = MAKEWORD(2, 2); WSADATA wsaData; if (WSAStartup(sockVersion, &wsaData) != 0) { return 0; }
SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server_socket == INVALID_SOCKET)
{
perror("Socket error!\n");
return 0;
}
sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888);
server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(server_socket, (LPSOCKADDR)&server_addr, sizeof(server_addr)) == SOCKET_ERROR)
{
perror("Bind error!\n");
return 0;
}
if (listen(server_socket, 20) == SOCKET_ERROR)
{
perror("Listen error!\n");
return 0;
}
while (1)
{
cout << "Waiting for connection..." << endl;
SOCKET client_socket;
sockaddr_in client_addr;
int client_addr_length = sizeof(client_addr);
client_socket = accept(server_socket, (SOCKADDR*)&client_addr, &client_addr_length);
if (client_socket == INVALID_SOCKET)
{
perror("Failed to establish socket connection:\n");
continue;
}
WCHAR IP_BUFFER[256] = TEXT("0");
InetNtop(AF_INET, &client_addr.sin_addr, IP_BUFFER, 256);
wcout << "Socket connection established, client IP: " << IP_BUFFER << ", port: "
<< ntohs(client_addr.sin_port) << endl;;
string choice = receiveData(client_socket);
if (choice.empty())
{
break;
}
if (choice == "1")
{
uploadFile(client_socket);
}
else if (choice == "2")
{
downloadFile(client_socket);
}
else if (choice == "3")
{
listFiles(client_socket);
}
closesocket(client_socket);
}
closesocket(server_socket);
WSACleanup();
return 0;
原文地址: https://www.cveoy.top/t/topic/hWXF 著作权归作者所有。请勿转载和采集!