2011-08-04 66 views
0

我在网络编程的工作,我有这样的代码什么可能导致无限循环错误

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); 

什么可能会导致此问题,以及如何解决此问题? 在此先感谢..

+1

我怀疑这是你的主要问题,但同时应该说'while(remainLength> 0)'。每当我看到'while(true)'或同等的东西时,我都会不寒而栗。尽管这可能与由于某种原因维持长时间负值相关;你只有在== 0时才会破坏。 – Flynn1179

+0

检查客户端是否读取数据 –

+1

我认为这太微不足道了,但如果currentSentLength为0或负数,或者如果剩余长度变为负数,while循环将会卡住。 – Johan

回答

2

如果内核缓冲区已满并阻塞IO发送,则block将阻塞,直到客户端已读取数据。你发大块吗?如果是这样,请检查您的客户。

如果您不信任客户端(他们可能会滥用此功能来执行拒绝服务攻击),有几种方法可以正确执行此操作:套接字上的轮询(超时)以实现可写性,使用超时发送,使用非阻塞I/O,...

1

我猜你调用send()用大小为负... 您的测试退出,而应该是 remainLength < = 0 而不是 remainLength == 0

+0

为什么它会是负面的? –

+0

@yi_H:因为'stillLength - = currentSentLength;'可能变成负数,这取决于send()返回的结果。 –

+0

不行,'send'不能发送超过你请求的内容。 –

相关问题