我正在进行网络编程,我有这段代码
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);
可能导致此问题的原因以及如何解决此问题? 提前谢谢..
答案 0 :(得分:2)
如果内核缓冲区已满,则阻塞IO发送将block
,直到客户端已读取数据为止。你送大块的吗?如果是,请检查您的客户。
如果你不信任客户端(他们可以滥用它来做拒绝服务攻击),有几种方法可以正确地做到这一点:在套接字上轮询(使用超时)以实现可写性,使用超时发送,使用非阻塞I / O,......
答案 1 :(得分:1)
我猜你正在调用负数大小的send()...... 你的测试应该退出 remainingLength&lt; = 0 并不是 remainLength == 0