[英]CLion execution through some GTest TEST_F hangs, step-by-step debugging goes backwards?
[英]Code only runs properly if debugging step-by-step
我正在制作一個網絡服務器,但遇到了一些非常奇怪的問題。
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 *不能解決問題。
提前致謝。
編輯:
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[]
,並且該string
是std::string
您的代碼不會執行您認為的操作。 當您將數據傳遞到WEB::Send
它將創建一個std::string
從data
所有字節一直到第一個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.