#include <tchar.h> #include <winsock2.h>
#include <string.h>
#include <Ws2tcpip.h> #include #include<io.h> #pragma comment(lib,"ws2_32.lib")

#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;
#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

原文地址: https://www.cveoy.top/t/topic/hWXF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录