我正在做一个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] 举报,一经查实,本站将立刻删除。