什么可能导致无限循环错误

时间:2011-08-04 08:57:48

标签: c++ c linux network-programming

我正在进行网络编程,我有这段代码

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

可能导致此问题的原因以及如何解决此问题? 提前谢谢..

2 个答案:

答案 0 :(得分:2)

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

如果你不信任客户端(他们可以滥用它来做拒绝服务攻击),有几种方法可以正确地做到这一点:在套接字上轮询(使用超时)以实现可写性,使用超时发送,使用非阻塞I / O,......

答案 1 :(得分:1)

我猜你正在调用负数大小的send()...... 你的测试应该退出 remainingLength&lt; = 0 并不是 remainLength == 0