我在网络编程的工作,我有这样的代码什么可能导致无限循环错误
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