我在網絡編程的工作,我有這樣的代碼什麼可能導致無限循環錯誤
void WorkHandler::workLoop(){
.
.
.
while(1){
if(remainLength >= MAX_LENGTH)
currentSentLength = send(client->getFd(), sBuffer, MAX_LENGTH, MSG_NOSIGNAL);
else
currentSentLength = send(client->getFd(), sBuffer, remainLength,MSG_NOSIGNAL);
if(currentSentLength == -1){
log("WorkHandler::workLoop, connection has been lost \n");
break;
}
sBuffer += currentSentLength;
remainLength -= currentSentLength;
if(remainLength == 0)
break;
}
}
而且,我創建一個子線程這樣
bool WorkHandler::initThreads(){
for(int i=0; i < m_maxThreads; i++){
pthread_t *thread(new pthread_t);
m_workThreadList.push_back(thread);
if(pthread_create(thread, NULL, runWorkThread, reinterpret_cast<void *>(this))!=0){
log("WorkHandler::initThreads, pthread_create error \n");
return false;
}
pthread_detach(*thread);
}
return true;
}
void* WorkHandler::runWorkThread(void *delegate){
printf("WorkHandler::runWorkThread, called\n");
WorkHandler *ptr = reinterpret_cast<WorkHandler*>(delegate);
ptr->workLoop();
return NULL;
}
我在gdb上運行這個代碼,它並沒有炸燬,但它被卡在if then else循環中的第二個發送函數中。我將日誌語句放在每一行中,並在第二個發送函數上方打印日誌並停止。
currentSentLength = send(client->getFd(), sBuffer, remainLength, MSG_NOSIGNAL);
什麼可能會導致此問題,以及如何解決此問題? 在此先感謝..
我懷疑這是你的主要問題,但同時應該說'while(remainLength> 0)'。每當我看到'while(true)'或同等的東西時,我都會不寒而慄。儘管這可能與由於某種原因維持長時間負值相關;你只有在== 0時纔會破壞。 – Flynn1179
檢查客戶端是否讀取數據 –
我認爲這太微不足道了,但如果currentSentLength爲0或負數,或者如果剩餘長度變爲負數,while循環將會卡住。 – Johan