file transfer via winsock



  • hi leute!
    ich arbeite gerade an einem prog mit dem ich file via winsock per tcp/ip protokoll verschicken kann...
    leider funzt da beim code was net!
    es kommt wohl beim client das file an, is auch gleich gross wie da orginal file aber wenn ich eine .rar oder .doc datei schick dann kann ich die nimmer öffnen wenn das file so ~400kb gross ist...
    was mach ich da falsch??

    cu

    #include <winsock2.h>
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <iostream.h>
    #include <string.h>
    
    #pragma comment( lib, "ws2_32.lib" )
    
    typedef struct _NETFILEHEADER
    {
        unsigned long FileSize;
        char pFileName[256];
    } NETFILEHEADER;
    
    long SendFileToNet(const char *pFileName,
                       const char *pIP,
                       unsigned short Port)
    {
        FILE *pFile;
        unsigned long FileSize;
        char buffer[4096];
        NETFILEHEADER FileHeader;
        SOCKET sender;
        WSADATA wsa;
        SOCKADDR_IN addr;
        int addrlen = sizeof(SOCKADDR_IN);
    
        pFile = fopen(pFileName, "rb");
    
        if(!pFile) return 0;
    
        fseek(pFile, 0, SEEK_END);
        FileSize = ftell(pFile);
        fseek(pFile, 0, SEEK_SET);
    
        FileHeader.FileSize = FileSize;
        memset(FileHeader.pFileName, 0, 256);
        memcpy(FileHeader.pFileName, pFileName, strlen(pFileName));
    
        WSAStartup(MAKEWORD(2,0),&wsa);
    
        sender = socket(AF_INET, SOCK_STREAM, 0);
    
        memset(&addr, 0, sizeof(SOCKADDR_IN));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(Port);
        addr.sin_addr.s_addr = inet_addr(pIP);
    
        connect(sender, (SOCKADDR*)&addr, addrlen);
    
        send(sender, (char*)&FileHeader, sizeof(NETFILEHEADER), 0);
    
        while(FileSize >= 4096)
        {
            fread(buffer, 4096, 1, pFile);
            send(sender, buffer, 4096, 0);
    
            FileSize -= 4096;
        }
    
        if(FileSize)
        {
            fread(buffer, FileSize, 0, pFile);
            send(sender, buffer, FileSize, 0);
        }
    
        closesocket(sender);
    
        fclose(pFile);
    
        WSACleanup();
    
        return FileSize;
    }
    
    long GetFileFromNet(unsigned short Port)
    {
        SOCKET server;
        SOCKET client;
        WSADATA wsa;
        SOCKADDR_IN addr;
        char buffer[4096];
        long rval;
        FILE *pFile;
        NETFILEHEADER FileHeader;
        long FileSize;
    
        int addrlen = sizeof(SOCKADDR_IN);
    
        WSAStartup(MAKEWORD(2,0),&wsa);
    
        server = socket(AF_INET, SOCK_STREAM, 0);
    
        memset(&addr, 0, sizeof(SOCKADDR_IN));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(Port);
        addr.sin_addr.s_addr = INADDR_ANY;
        bind(server, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
    
        listen(server, 10);
    
        client = accept(server, (SOCKADDR*)&addr, &addrlen);
    
        recv(client, (char*)&FileHeader, sizeof(NETFILEHEADER), 0);
    
        FileSize = FileHeader.FileSize;
    
        pFile = fopen(FileHeader.pFileName, "wb");
    
        while(FileSize > 0)
        {
            rval = recv(client, buffer, 4096, 0);
            fwrite(buffer, rval, 1, pFile);
    
            FileSize -= rval;
        }
    
        fclose(pFile);
    
        closesocket(client);
        closesocket(server);
    
        WSACleanup();
    
        return FileHeader.FileSize;
    }
    
    void main(void)
    {
        SendFileToNet("testfile.txt", "192.168.0.1", 80);
        //GetFileFromNet(80);
    }
    

Anmelden zum Antworten