gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:38:22 26 4
gpt4 key购买 nike

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

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

什么可能导致这个问题,我该如何解决这个问题?提前致谢..

最佳答案

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

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

关于c++ - 什么可能导致无限循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6938640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com