微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

代码只有在逐步debugging的情况下才能正常运行

我正在做一个networking服务器,我想出了一些非常奇怪的问题。

我的服务器昨天当我关掉我的笔记本电脑时,运行正常,但今天它只发送http头(我没有改变任何东西)

用户请求一个文件,如果我使用下面的代码发送它,它完美的工作:

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

但如果我改变它,它只发送〜2%的文件。 这不是一个随机数,它实际上只发送了大约2%的文件

while ((n = fread(data,file)) > 0) web.Send(data); int WEB::Send(string data) { return send(TempSocket,data.c_str(),data.size(),0); }

将string更改为char *不能解决问题。

延迟加载DLL

使用MinGW-w64编译Windows的LAPACK

LNK1106与大二进制资源

报告types“json”未知

当程序可见或最小化时,进程ID改变

我正在使用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); while (GetMessage(&msg,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,SlaveThread,(LPVOID)tmpsock,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,file)) > 0) { d+=send(ts,0); i+=n; } printf("%i=%i=%in",i,d); fclose(file);

使用ms编译器在windows上构build一个python模块

在Windows XP中使用Visual Studio 2015中的XP定位进行编译时发生致命错误

使用Visual Studio 2008编译的C ++ dll可以用于Visual Studio 2005吗?

如何运行没有Visual Studio的Windows Phone 8模拟器?

在Windows 10中,Visual Studio中的embedded式Web浏览器控件将发生什么变化?

假设data是char[]的一些大小,而该string是std::string你的代码不会做你认为它的作用。 当你将数据传递给WEB::Send数据时,从data所有字节开始,直到第一个0为止,这个data大概占总数据的2%。 你想调用web.Send(std::string(data,n)); 代替。

同样在WEB::Send您需要调用data.data()而不是c_str()来避免与空值相同的问题。

调试时C ++代码的行为不同,几乎总是一个未初始化(或不正确初始化)的变量。

你能告诉我们data的声明吗? TempSocket ?

你将不得不向我们展示更多的代码来告诉你更多。

读取的字节数可能不等于字符串的实际大小,因为每次都不会在循环中初始化data 。 但在第一种情况下,您指定的数据大小等于n ,在第二种情况下,您发送的大小为data.size() 。 最后可能会有垃圾

从源代码可以看出,你正在使用线程。 我想你必须以适当的方式同步它们。 为什么? 正如你所说的,如果在调试模式下一步一步地执行你的程序,那么你的程序是正确的。 否则它不会。 这些执行(逐步执行或整个程序一次)之间的唯一区别是时间。 一步一步地慢一点,显然有足够的时间让你的一些线程完成一些工作。 在某些机器上,即使不改变任何东西,程序也可能正常工作。 这是随机的。 所以 – 你必须注意你如何同步线程。

我希望这有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐