繁体   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