UDP传输文件

Server端:

#include "stdafx.h"
#include "NetWork.h"
#include "winsock2.h"

// innitialize socket
bool InitializeSocket()
{
    bool bRet = false;
    do
    {
        WSAData wsadata;
        if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
            break;
        if (2 != LOBYTE(wsadata.wVersion) || 2 != HIBYTE(wsadata.wVersion))
            break;

        bRet = true;
    } while (false);
    return bRet;
}
sockaddr_in clientAddr;
// BindSocketToPort
int BindSocketToPort()
{
    int nRet = -1;
    do
    {        
        SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
        sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(8080);
        addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.3"); // 0 any ip
        nRet = bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR));
        if (nRet == SOCKET_ERROR)
            break;
        nRet = sock;
    } while (false);    
    return nRet;
}
bool StartServer(int socket)
{
    int len = sizeof(SOCKADDR);

    char buf[1024] = { 0 };
    int res = recvfrom(socket, buf, sizeof(buf), 0, (SOCKADDR*)&clientAddr, &len);
    printf("First Receiver from client:%s,%d\n", buf, socket);
    CreateThread(0, 0, RecvProc, (void*)(&socket), 0, 0);

    while (true)
    {
        char buf[1024] = { 0 };
        gets_s(buf, 1024);
        sendto(socket, buf, 1024, 0, (SOCKADDR*)&clientAddr, sizeof(SOCKADDR));
    }
}

unsigned long __stdcall RecvProc(void* lpParameter)
{
    int sock = *(int*)lpParameter;
    char*pRecvFileData = nullptr; //file data pointer
    long fileSize = 0;
    char fileName[256] = { 0 };
    int receivedFileLen = 0; // received file len
    int realResLen = 0;
    FILE* fp = 0;
        
    while (true)
    {
        char buf[1500] = { 0 };
        int res = recvfrom(sock, buf, sizeof(buf), 0, 0, 0);
        //printf("recevied from client:%s,%d\n", buf, sock);        
        int id = *(int*)buf; // ID flag
        realResLen = res - sizeof(int) - sizeof(int);
        switch (id)
        {
        // data
        case 1:
            {
                FileData* fd = (FileData*)buf;
                printf("received data :%d,%s", fd->index, fd->fileData);
                //notice the index of data
                memcpy(pRecvFileData+fd->index*1024, fd->fileData, realResLen);
                receivedFileLen += realResLen;
            }
            break;
        // header
        case 2:
            {
            
                memcpy(&fileSize, buf+sizeof(int), sizeof(fileSize));
                memset(fileName, 0, 256);
                strcpy_s(fileName, buf +sizeof(int)+ sizeof(fileSize));    

                printf("file Name: %s, file Size: %d\n", fileName, fileSize);
                // open file
                fopen_s(&fp, fileName, "wb");
                // ready to  receive data                
                pRecvFileData = new char[fileSize];
                memset(pRecvFileData,0, fileSize);
            }
            break;

        default:
            break;
        }

        printf("receivedFileLen:%d;fileSize:%d", receivedFileLen, fileSize);
        // if the file is tranfer finished,you must close the file
        if (receivedFileLen==fileSize && receivedFileLen !=0)
        {
            // write data into file
            fwrite(pRecvFileData, receivedFileLen, 1, fp);
            fclose(fp);
            receivedFileLen = 0;
            printf("file received finished!");
        }
    }
    return 0;
}

 

客户端:

#include "stdafx.h"
#include "NetWork.h"
#include "winsock2.h"
#include "stdio.h"

// innitialize socket
bool InitializeSocket()
{
    bool bRet = false;
    do
    {
        WSAData wsadata;
        if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
            break;
        if (2 != LOBYTE(wsadata.wVersion) || 2 != HIBYTE(wsadata.wVersion))
            break;

        bRet = true;
    } while (false);
    return bRet;
}

struct FileData
{
    int id; // flag 2:fileName or 1:data
    int index; // index data
    char fileData[1024]; // data
};
char* getFileName(char* filePath)
{
    int len = strlen(filePath);
    for (int i = len; i >=0; i--)
    {
        if (filePath[i]=='/'||filePath[i]=='\\')
        {
            return &filePath[i+1];
        }
    }
    return 0;
}
// Create Socket
int StartTalking(const char* ip, unsigned short port)
{
    int nRet = -1;
    do
    {        
        SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
        sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        addr.sin_addr.S_un.S_addr = inet_addr(ip); // 0 any ip
    
        sendto(sock, "hello", strlen("hello"), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR));
        CreateThread(0, 0,RecvFrom, (void*)&sock, 0, 0);
        while (true)
        {
            char buf[1024] = { 0 };
            printf("Please Input File Name for transfer: ");
            gets_s(buf);
            // Get file size
            long size = GetFileLength(buf);
            char* realFileName = getFileName(buf);
            char sendBuf[1024] = { 0 };
            int fileSizeID = 2;
            memcpy(sendBuf, &fileSizeID, sizeof(int));
            memcpy(&sendBuf[sizeof(int)], &size, sizeof(size));
            memcpy(&sendBuf[sizeof(size)+sizeof(int)], realFileName, strlen(realFileName));
            printf("file name is:%s\n", realFileName);
            // Send
            sendto(sock, sendBuf,sizeof(int)+ sizeof(size)+strlen(buf), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR));
            // Send data
            FILE* pf = 0;
            fopen_s(&pf, buf, "rb");

            int index = 0;
            while (!feof(pf))
            {
                FileData fd = { 0 };                
                fd.id = 1;  // flag for message
                fd.index = index++;                    
                int readsize = fread(fd.fileData, 1, 1024, pf);
                printf("read file data :%s\n", fd.fileData);
                sendto(sock, (char*)&fd, readsize+sizeof(int)*2, 0, (SOCKADDR*)&addr, sizeof(addr)); // send file data to server    
                Sleep(10);
            }
            fclose(pf);
        
        }
        nRet = sock;
    } while (false);
    return nRet;
}
// Get the file Length
long GetFileLength(char* fileName)
{
    long lRet = 0;
    do
    {
        FILE *pf = 0;
        int errInfo = fopen_s(&pf, fileName, "r+");
        if (0 != errInfo)
            break;
        fseek(pf, 0, SEEK_END);

        long size = ftell(pf);
        fclose(pf);
        lRet = size;    
    } while (false);
    return lRet;
}

unsigned long __stdcall  RecvFrom(void* lpParameter)
{
    int sock = *(int*)lpParameter;
    while (true)
    {
        char buf[1024] = { 0 };
        recvfrom(sock, buf, 1024, 0, 0, 0);
        printf("received from server:%s\n", buf);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蚂蚁_CrkRes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值