开发者

What might cause an infinite loop error

I am working on a network programming and I have this code

void WorkHandler::workLoop(){
.
.
.

while(1){
    if(remainLength >= MAX_LENGTH)
        currentSentLength = send(client->getFd(), sBuffer, MAX_LENGTH, MSG_NOSIGNAL);
    else
        currentSentLength = send(client->getFd(), sBuffer, remainLen开发者_运维问答gth,MSG_NOSIGNAL);


if(currentSentLength == -1){
    log("WorkHandler::workLoop, connection has been lost \n");
    break;
}
sBuffer += currentSentLength;
remainLength -= currentSentLength;

if(remainLength == 0)
    break;
     }
}

Also, I am creating a child thread like this

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

I am running this code on gdb and it doesn't blow up but it gets stuck at the second send function in the if then else loop. I put log statements every single line and it prints a log right above the second send function and stopped.

currentSentLength = send(client->getFd(), sBuffer, remainLength, MSG_NOSIGNAL);

What might cause this problem and how do I fix this issue? Thanks in advance..


With blocking IO send will block if the kernel buffer is full and will block untill the clients have read the data. Do you send large chunks? If so, check your client.

If you don't trust clients (they can abuse this to do denial of service attacks) there are a couple of ways to do this properly: poll (with timeout) on the sockets for writeability, send with timeout, use nonblocking I/O, ...


I guess you're calling send() with a negative size... Your test to exit the while should be remainLength <= 0 and not remainLength == 0

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜