簡體   English   中英

只有逐步調試,代碼才能正常運行

[英]Code only runs properly if debugging step-by-step


我正在制作一個網絡服務器,但遇到了一些非常奇怪的問題。

  1. 昨天關閉筆記本電腦后,服務器運行正常,但是今天它僅發送http標頭(我沒有做任何更改)
  2. 當用戶請求文件時,如果我使用以下代碼發送文件,則可以正常運行:

while ((n = fread(data, 1, sizeof(data), file)) > 0) send(ts, data, n, 0);

但是如果我將其更改為此,它僅發送文件的〜2%。 這不是一個隨機數,它實際上僅發送文件的2%。

while ((n = fread(data, 1, sizeof(data), file)) > 0)
web.Send(data);

int WEB::Send(string data)
{
    return send(TempSocket, data.c_str(), data.size(), 0);
}

將字符串更改為char *不能解決問題。

  • 我正在使用visual studio2010。 如果我逐步執行代碼,則能夠解決問題#1,一切都將發送出去。 這是我的主要問題。 我不明白為什么會這樣。 希望有人可以向我解釋。

提前致謝。

編輯:

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,int nShow)
{
    SOCKET MainSocket=0;
    MSG msg;


    RedirectIOToConsole();





    CreateThread(NULL, NULL, ListenThread, NULL, NULL, NULL);



    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }


    WSACleanup();
    closesocket(MainSocket);
    MainSocket = INVALID_SOCKET;

    return msg.wParam;
}

DWORD WINAPI ListenThread(LPVOID lparam)
{
    SOCKET MainSocket;
    WSADATA wsaData;
    SOCKET tmpsock;
    struct sockaddr_in local, from;
    int fromlen=sizeof(from);

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


    local.sin_family=AF_INET;
    local.sin_addr.s_addr=INADDR_ANY;
    local.sin_port=htons(PORT);
    MainSocket=socket(AF_INET,SOCK_STREAM,0);

    if(MainSocket==INVALID_SOCKET)
    {
        return 0;
    }
    if(bind(MainSocket,(struct sockaddr*)&local,sizeof(local))!=0)
    {
        return 0;
    }
    if(listen(MainSocket,10)!=0)
    {
        return 0;
    }


    while(1)
    {
        tmpsock = accept(MainSocket,(struct sockaddr*)&from,&fromlen);
        CreateThread(NULL, NULL, SlaveThread, (LPVOID)tmpsock, NULL, NULL);
    }

}

DWORD WINAPI SlaveThread(LPVOID lparam)
{
    SOCKET ts = (SOCKET)lparam;//temporary socket
......

char data[4096];
                    int n;
                    unsigned long int length = statbuf.st_size;

                    web.SendHeaders(200, "OK", format("Content-Disposition: attachment; filename=\"%s\"", FileName.c_str()).c_str(), web.GetMimeType(ReqPath.c_str()), length, statbuf.st_mtime);
                    unsigned long int i=0,d=0;
                    while ((n = fread(data, 1, sizeof(data), file)) > 0)
                    {
                        d+=send(ts, data, n, 0);
                        i+=n;
                    }
                    printf("%i=%i=%i\n", length,i,d);
                    fclose(file);

在調試時行為不同的C ++代碼幾乎總是未初始化(或未正確初始化)的變量。

您能告訴我們data聲明嗎? TempSocket

您必須向我們展示更多代碼才能告訴您更多信息。

假設data是某種大小的char[] ,並且該stringstd::string您的代碼不會執行您認為的操作。 當您將數據傳遞到WEB::Send它將創建一個std::stringdata所有字節一直到第一個0,大約是總數據的2%。 您想調用web.Send(std::string(data, n)); 代替。

同樣在WEB::Send您需要調用data.data()而不是c_str()來避免相同的null問題。

讀取的字節數不能等於字符串的實際大小,因為您不會每次都在循環中初始化data 但是在第一種情況下,您指定的數據大小等於n ,在第二種情況下,您發送的大小為data.size() 最后可能會有垃圾。

從源代碼可以看出,您正在使用線程。 我想您必須以適當的方式同步它們。 為什么? 如您所說,如果在調試模式下逐步執行程序,則程序可以正常工作; 否則就不會。 這些執行方式(逐步執行或一次執行整個程序)之間的唯一區別是計時。 一步一步比較慢,並且顯然有足夠的時間讓您的某些線程完成某些工作。 在某些計算機上,即使您不進行任何更改,您的程序也可能會正常運行。 這是隨機性。 所以-您必須注意如何同步線程。

我希望這有幫助。

暫無
暫無

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

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