C++ Winsock将文件上载到远程服务器

C++ Winsock将文件上载到远程服务器,c++,winsock,C++,Winsock,我试图上传文件到服务器,但他们总是来破坏,该程序非常简单,只用于传输客户端和服务器之间的文件。 我需要这段代码的帮助,以解决问题。 并加以改进 服务器 int Socket_Manip::FILE_UPLOAD() { //get file size. iResult = recv(ClientSocket, GotFileSize, LENGTH, 0); if (iResult == 0) { closesocket(ClientSo

我试图上传文件到服务器,但他们总是来破坏,该程序非常简单,只用于传输客户端和服务器之间的文件。 我需要这段代码的帮助,以解决问题。 并加以改进

服务器

    int Socket_Manip::FILE_UPLOAD() {

    //get file size.
    iResult = recv(ClientSocket, GotFileSize, LENGTH, 0);
    if (iResult == 0)
    {
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }
    else if (iResult < 0) {
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }

    //start manip download
    long FileSize = atoi(GotFileSize);
    long SizeCheck = 0;
    char* mfcc;

    FILE *fp = fopen("C::\\Users\\Server\\Downloads\\transfer.zip", "wb");
    if (fp == NULL)
    {
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }
    if (FileSize > 1499) {
        mfcc = (char*)malloc(1500);
        while (FileSize > SizeCheck){
            int Received = recv(ClientSocket, mfcc, 1500, 0);
            if (Received == 0)
            {
                break;
            }
            else if (Received < 0) {
                closesocket(ClientSocket);
                WSACleanup();
                return 1;
            }
            SizeCheck += Received;
            fwrite(mfcc, 1, Received, fp);
            fflush(fp);
        }
    } else 
    {
        mfcc = (char*)malloc(FileSize + 1);
        int Received = recv(ClientSocket, mfcc, FileSize, 0);
        fwrite(mfcc, 1, Received, fp);
        fflush(fp);
    }

    fclose(fp);
    free(mfcc);

}
int File_Transfer_Manip() {
    FILE *File;
    char *Buffer;
    unsigned long Size;


    File = fopen("C:\\Users\\r4minux\\Downloads\\upload.zip", "rb");
    if (!File)
    {
        printf("Error file\n");
        return 1;
    }

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

    Buffer = new char[Size];

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

    fclose(File);
    iResult = send(ConnectSocket, cSize, MAX_PATH, 0); // File size
    if (iResult == SOCKET_ERROR) {
        printf("send erroR: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        getchar();
        return 1;
    }

    int Offset = 0;
    while (Offset < Size)
    {
        int Amount = send(ConnectSocket, Buffer + Offset, Size - Offset, 0);
        if (Amount <= 0)
        {
            std::cout << "Error: " << WSAGetLastError() << std::endl;
            break;
        }
        else
        {
            Offset += Amount;
        }
    }

    // cleanup
    free(Buffer);

}
intsocket\u Manip::FILE\u UPLOAD(){
//获取文件大小。
iResult=recv(ClientSocket,GotFileSize,长度,0);
如果(iResult==0)
{
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
否则如果(iResult<0){
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
//启动manip下载
long FileSize=atoi(GotFileSize);
长SizeCheck=0;
char*mfcc;
文件*fp=fopen(“C::\\Users\\Server\\Downloads\\transfer.zip”,“wb”);
如果(fp==NULL)
{
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
如果(文件大小>1499){
mfcc=(char*)malloc(1500);
而(文件大小>大小检查){
接收到的int=recv(ClientSocket,mfcc,1500,0);
如果(接收==0)
{
打破
}
否则,如果(接收<0){
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
SizeCheck+=已接收;
fwrite(mfcc,1,接收,fp);
fflush(fp);
}
}否则
{
mfcc=(char*)malloc(FileSize+1);
int Received=recv(ClientSocket,mfcc,FileSize,0);
fwrite(mfcc,1,接收,fp);
fflush(fp);
}
fclose(fp);
免费(mfcc);
}
客户端发件人

    int Socket_Manip::FILE_UPLOAD() {

    //get file size.
    iResult = recv(ClientSocket, GotFileSize, LENGTH, 0);
    if (iResult == 0)
    {
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }
    else if (iResult < 0) {
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }

    //start manip download
    long FileSize = atoi(GotFileSize);
    long SizeCheck = 0;
    char* mfcc;

    FILE *fp = fopen("C::\\Users\\Server\\Downloads\\transfer.zip", "wb");
    if (fp == NULL)
    {
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }
    if (FileSize > 1499) {
        mfcc = (char*)malloc(1500);
        while (FileSize > SizeCheck){
            int Received = recv(ClientSocket, mfcc, 1500, 0);
            if (Received == 0)
            {
                break;
            }
            else if (Received < 0) {
                closesocket(ClientSocket);
                WSACleanup();
                return 1;
            }
            SizeCheck += Received;
            fwrite(mfcc, 1, Received, fp);
            fflush(fp);
        }
    } else 
    {
        mfcc = (char*)malloc(FileSize + 1);
        int Received = recv(ClientSocket, mfcc, FileSize, 0);
        fwrite(mfcc, 1, Received, fp);
        fflush(fp);
    }

    fclose(fp);
    free(mfcc);

}
int File_Transfer_Manip() {
    FILE *File;
    char *Buffer;
    unsigned long Size;


    File = fopen("C:\\Users\\r4minux\\Downloads\\upload.zip", "rb");
    if (!File)
    {
        printf("Error file\n");
        return 1;
    }

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

    Buffer = new char[Size];

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

    fclose(File);
    iResult = send(ConnectSocket, cSize, MAX_PATH, 0); // File size
    if (iResult == SOCKET_ERROR) {
        printf("send erroR: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        getchar();
        return 1;
    }

    int Offset = 0;
    while (Offset < Size)
    {
        int Amount = send(ConnectSocket, Buffer + Offset, Size - Offset, 0);
        if (Amount <= 0)
        {
            std::cout << "Error: " << WSAGetLastError() << std::endl;
            break;
        }
        else
        {
            Offset += Amount;
        }
    }

    // cleanup
    free(Buffer);

}
int File\u Transfer\u Manip(){
文件*文件;
字符*缓冲区;
无符号长尺寸;
File=fopen(“C:\\Users\\r4minux\\Downloads\\upload.zip”,“rb”);
如果(!文件)
{
printf(“错误文件\n”);
返回1;
}
fseek(文件,0,SEEK_END);
大小=ftell(文件);
fseek(文件,0,搜索集);
缓冲区=新字符[大小];
fread(缓冲区,大小,1,文件);
char cSize[最大路径];
sprintf(cSize,“%i”,大小);
fclose(文件);
iResult=send(ConnectSocket,cSize,MAX_PATH,0);//文件大小
if(iResult==SOCKET\u错误){
printf(“发送错误:%d\n”,WSAGetLastError());
闭合插座(连接插座);
WSACleanup();
getchar();
返回1;
}
整数偏移=0;
while(偏移量<大小)
{
int Amount=send(ConnectSocket,缓冲区+偏移量,大小-偏移量,0);

如果(AmountTCP是一个字节流。它没有消息边界的概念。你不能确保
send()
实际上发送了你给它的所有内容,或者
recv()
正在读取你要求它读取的所有内容。它们可以返回更少的字节。你必须对此做出解释

请尝试以下方法:

服务器:

int readBytes(SOCKET s, void *buffer, int buflen)
{
    int total = 0;

    unsigned char *pbuf = (unsigned char*) buffer;
    while (buflen > 0)
    {
        int iResult = recv(s, pbuf, buflen, 0);
        if (iResult < 0)
        {
            if (WSAGetLastError() == WSAEWOULDBLOCK)
            {
                // optionally use select() to wait for the
                // socket to have more bytes to read before
                // calling recv() again...
                continue;
            }

            printf("recv error: %d\n", WSAGetLastError());
            return SOCKET_ERROR;
        }
        else if (iResult == 0)
        {
            printf("disconnected\n");
            return 0;
        }
        else
        {
            pbuf += iResult;
            buflen -= iResult;
            total += iResult;
        }
    }

    return total;
}

int Socket_Manip::FILE_UPLOAD()
{
    //start download

    FILE *fp = fopen("C::\\Users\\Server\\Downloads\\transfer.zip", "wb");
    if (fp == NULL)
    {
        printf("Error creating file\n");
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }

    //get file size.
    unsigned long FileSize;
    int iResult = readBytes(ClientSocket, &FileSize, sizeof(FileSize));
    if (iResult <= 0)
    {
        fclose(fp);
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }
    FileSize = ntohl(FileSize);

    char mfcc[1024];
    while (FileSize > 0)
    {
        int Received = readBytes(ClientSocket, mfcc, min(sizeof(mfcc), FileSize));
        if (Received <= 0)
        {
            fclose(fp);
            closesocket(ClientSocket);
            WSACleanup();
            return 1;
        }

        if (fwrite(mfcc, 1, Received, fp) != Received)
        {
            printf("Error writing file\n");
            fclose(fp);
            closesocket(ClientSocket);
            WSACleanup();
            return 1;
        }

        FileSize -= Received;
    }

    fflush(fp);
    fclose(fp);

    return 0;
}
int readBytes(套接字、void*缓冲区、int buflen)
{
int-total=0;
无符号字符*pbuf=(无符号字符*)缓冲区;
而(buflen>0)
{
int-iResult=recv(s,pbuf,buflen,0);
如果(iResult<0)
{
if(WSAGetLastError()==WSAEWOULDBLOCK)
{
//(可选)使用select()等待
//套接字之前要读取更多字节
//再次调用recv()。。。
继续;
}
printf(“recv错误:%d\n”,WSAGetLastError());
返回套接字错误;
}
else if(iResult==0)
{
printf(“断开连接的\n”);
返回0;
}
其他的
{
pbuf+=iResult;
buflen-=iResult;
总计+=iResult;
}
}
返回总数;
}
int Socket_Manip::FILE_UPLOAD()
{
//开始下载
文件*fp=fopen(“C::\\Users\\Server\\Downloads\\transfer.zip”,“wb”);
如果(fp==NULL)
{
printf(“创建文件时出错”);
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
//获取文件大小。
未签名的长文件大小;
int-iResult=readBytes(ClientSocket,&FileSize,sizeof(FileSize));
如果(iResult 0)
{
接收的int=readBytes(ClientSocket,mfcc,min(sizeof(mfcc),FileSize));
如果(收到0)
{
int-iResult=send(s,pbuf,buflen,0);
如果(iResult<0)
{
if(WSAGetLastError()==WSAEWOULDBLOCK)
{
//(可选)使用select()等待
//套接字之前要有更多的写入空间
//再次调用send()。。。
继续;
}
printf(“发送错误:%d\n”,WSAGetLastError());
返回套接字错误;
}
else if(iResult==0)
{
printf(“断开连接的\n”);
返回0;
}
其他的
{
pbuf+=iResult;
buflen-=iResult;
总计+=iResult;
}
}
返回总数;
}
int File_Transfer_Manip()
{
字符缓冲区[1024];
文件*fp=fopen(“C:\\Users\\r4minux\\Downloads\\upload.zip”,“rb”);
如果(!fp)
{
printf(“打开文件时出错”);
返回1;
}
fseek(fp,0,SEEK_END);
无符号长文件大小=ftell(fp);
fseek(fp,0,SEEK_集);
无符号长tmpFileSize=htonl(文件大小);
int-iResult=sendBytes(ConnectSocket,&tmpFileSize,sizeof(tmpFileSize));
如果(iResult 0)
{
long Size=fread(缓冲区,1,min(缓冲区大小,文件大小),fp);
如果(尺寸)