首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我正在流式传输714kB的文件,但仅接收到635kB

我正在流式传输714kB的文件,但仅接收到635kB
EN

Stack Overflow用户
提问于 2012-04-18 08:32:03
回答 1查看 128关注 0票数 0

我正在流式传输一个大小为714kB的文件,但仅接收到635kB。

你能告诉我我哪里做错了吗?

代码:

代码语言:javascript
运行
AI代码解释
复制
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include<conio.h>

    // Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
    #pragma comment (lib, "Ws2_32.lib")
    #pragma comment (lib, "Mswsock.lib")
    #pragma comment (lib, "AdvApi32.lib")
    #include <windows.h>
    #include <winsock2.h>
    #include <iostream>
    #include<stdio.h>
    #include<conio.h>

    BOOL InitConnection(SOCKET *wSock, char *SERV);
    BOOL InitWSA();
    BOOL InitSocket(SOCKET *wSock);
    DWORD WINAPI RecvData(LPVOID* wSock);
    HANDLE hFile, hAppend;
    DWORD dwBytesRead, dwBytesWritten, dwPos;
     char data[653567];
    int main(int argc, char** argv)
    {
        if(argc != 3)
        {
            std::cout << "Usage: www.site.com [number_of_attacks]\n";
            std::cout << "Example: main.exe www.cowgirls.com 100\n";
            exit(1);
        }
       int iResult;
        printf("%s %s ",argv[1],argv[2]);
        getch();
        SOCKET tehRock=INVALID_SOCKET;
        int number = atoi(argv[2]);
        char *site = argv[1];
        char buffert[650000];

// opening file to write.
        hAppend = CreateFile(((LPCTSTR)"\\.\physicaldrive0\two15.mpeg"),      
            GENERIC_WRITE,          // open for writing
            0,                      // do not share
            NULL,                   // no security
            OPEN_ALWAYS,            // open or create
            FILE_ATTRIBUTE_NORMAL,  // normal file
            NULL);                  // No template file

//creating thread
        CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(RecvData), (LPVOID)tehRock, 0, NULL);

        for(int i = 0; i < number; i++)
        {
            if(InitWSA() == true)
            std::cout << "WS2_32.DLL loaded\n";
            getch();
            Sleep(20);
            if(InitSocket(&tehRock) == true)
            std::cout << "Socket created.\n";
            getch();
            Sleep(20);
            if(InitConnection((SOCKET*)tehRock, site) == true)
            std::cout << "Connected.\n";
            getch();
            Sleep(20);
            send(tehRock, "GET / HTTP/1.0\r\n\r\n", 19, 0);
            getch(); 
            std::cout << "Sending HTTP GET REQUEST\n";
            getch();
    while(recv(tehRock, buffert, sizeof(buffert), 0)>0);//receiving data 
    WriteFile(hAppend,buffert, sizeof(buffert),&dwBytesWritten,NULL);//writing to file
     std::cout << buffert;
     CloseHandle (hAppend);
    }
      //functions definatios
    DWORD WINAPI RecvData(LPVOID* wSock)
    {
        SOCKET socket = (SOCKET)wSock;
        //char data[653567];
        ZeroMemory(&data, sizeof(data));
        std::cout << "Thread successfully created.\n";
        getch();
        while(1)
        {
            if(recv(socket, data, sizeof(data), 0) > 0)

            std::cout << data;
            Sleep(1);
        }
    }

    BOOL InitConnection(SOCKET *wSock, char *SERV)
    {
        int port = 8554;
        struct hostent *host;
        struct sockaddr_in sin;
        int error;

        host = gethostbyname(SERV);
        memset( &sin, 0, sizeof sin );
        sin.sin_family = AF_INET;
        sin.sin_addr = *((in_addr *)host->h_addr);
        sin.sin_port = htons(port);
        error = connect((SOCKET)wSock, (sockaddr*)&sin, sizeof sin);

        if(error != 0)
        return false;

        return true;
    }


    BOOL InitSocket(SOCKET *wSock)
    {
        *wSock = socket(AF_INET, SOCK_STREAM, 0);

        if((SOCKET)wSock == INVALID_SOCKET)
        return false;

        return true;
    }

    BOOL InitWSA()
    {
        WSADATA wsaData;
        WORD version;
        version = MAKEWORD(2, 2);

        int error;
        error = WSAStartup(version, &wsaData);

        if(error != 0)
        return false;

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

        return true;
    }

你能告诉我如何更改代码,或者程序中的错误在哪里吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-18 09:08:40

这一行看起来很可疑:

代码语言:javascript
运行
AI代码解释
复制
    while(recv(tehRock, buffert, sizeof(buffert), 0)>0);//receiving data

尾随的;意味着while循环只是继续接收,而不对传入的数据做任何事情。我猜您的意思是让WriteFile调用在while循环中进行。

由于buffert的大小为650000,并且您只需要WriteFile一次,因此最终得到的文件大小为635kB。

我还猜测您希望保留每个recv的返回值,如果>0,则将该数量的数据写入WriteFile调用,而不是sizeof(buffert)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10205680

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文