簡體   English   中英

客戶端未創建文件

[英]Client-side not creating file

所以,我有一個工作插座。 我基本上是在做一個套接字,以允許我將文件從一個程序傳輸到另一個程序。 一切都在工作,除了在客戶端,它不會創建文件嗎?

服務器:

int main() {
    WSADATA Winsock;
    SOCKET Socket, Sub;
    Addr addr;
    IncomingAddress incomingAddress;
    int AddressLen = sizeof(IncomingAddress);

    // Start up Winsock
    WSAStartup(MAKEWORD(2, 2), &Winsock);

    if (LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2) {
        WSACleanup();
        return 0;
    }

    Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    // Memset alternative
    ZeroMemory(&addr, sizeof(Addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(portNumber);
    bind(Socket, (sockaddr*) &addr, sizeof(Addr));

    if (listen(Socket, 1) == SOCKET_ERROR) {
        printf("Listening error!\n");
    } else {
        printf("Listening...\n");
    }

    if (Sub = accept(Socket, (sockaddr*) &incomingAddress, &AddressLen)) {
        char *ClientIP = inet_ntoa(incomingAddress.sin_addr);
        int ClientPort = ntohs(incomingAddress.sin_port);
        printf("Client connected!\n");
        printf("IP: %s:%d\n", ClientIP, ClientPort);

        printf("Sending file... \n");

        FILE *File;
        char *Buffer;
        unsigned long Size;

        File = fopen("test.txt", "rb+");
        if (!File) {
            printf("Error while reading the file!\n");
            getchar();
            return 0;
        }

        fseek(File, 0, SEEK_END);
        Size = ftell(File);
        fseek(File, 0, SEEK_SET);

        Buffer = malloc(Size);

        fread(Buffer, Size, 1, File);
        char cSize[MAX_PATH];
        sprintf(cSize, "%i", Size);

        fclose(File);
        send(Sub, cSize, MAX_PATH, 0); // File size
    }
    return 0;
}

客戶:

int main() {
    WSADATA Winsock;
    SOCKET Socket;
    Addr addr;
    IncomingAddress incomingAddress;
    int AddressLen = sizeof(IncomingAddress);

    WSAStartup(MAKEWORD(2, 2), &Winsock);

    if (LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2) {
        WSACleanup();
        return 0;
    }

    Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    ZeroMemory(&addr, sizeof(Addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(6000);

    if (connect(Socket, (sockaddr*) &addr, sizeof(Addr)) < 0) {
        printf("Connection Failed!\n");
        getchar();
        return 0;
    }

    printf("Connection successful! \n");
    printf("Receiving file... \n");

    int Size;
    char *Filesize = malloc(1024);

    if (recv(Socket, Filesize, 1024, 0)) { // File Size
        Size = atoi((const char*) Filesize);
        printf("File size: %d\n", Size);
    }

    char *Buffer = malloc(Size);

    int Offset = 0;
    while (Size > Offset) {
        int Amount = recv(Socket, Buffer + Offset, Size - Offset, 0);

        if (Amount <= 0) {
            printf("Error: " + WSAGetLastError());
            break;
        } else {
            Offset += Amount;
            printf("2\n");
        }
    }

    FILE *File;
    File = fopen("test.txt", "wb+");
    fwrite(Buffer, 1, Size, File);
    fclose(File);

    getchar();
    closesocket(Socket);
    WSACleanup();
    return 0;
}

您只發送文件的長度,而不發送文件本身給客戶端:

    send(Sub, cSize, MAX_PATH, 0); // File size

這永遠不會收到任何東西:

    int Amount = recv(Socket, Buffer + Offset, Size - Offset, 0);

是的,也發送實際文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM