C ++ - AF_UNIX套接字挂起

时间:2015-05-27 09:53:29

标签: c++ sockets

我正在尝试通过AF_UNIX套接字启动并运行客户端/守护程序通信。

当客户端成功发送消息时,守护程序会接收并处理它,然后应该将消息发回。
嗯,这就是问题所在。一旦守护进程尝试发送消息就没有任何反应,客户端挂起,尝试读取消息,如果我杀死客户端,守护进程就会死掉。

以下是守护程序代码:

//successful call to accept, I have a file descriptor now...
int c = 0;
while((c = recv(fd, (char*)&buf[0], bufferSize, 0)))
{
    if(c == -1 || c == 0)
        break;
    tmp.append(buf.begin(), buf.begin()+c);
}

writeLog(tmp);
tmp = evaluateMsg(tmp);
writeLog(tmp);

//I assume this send call is hanging
if(send(fd, tmp.c_str(), tmp.size(), 0) < 0)
    writeLog("Could not write message back!");

close(fd);

这是客户端代码:

//connect(); is successful
//send(); as well - the recv(); call is hanging forever
while((c = recv(sockfd, (char*)&buf[0], 1024, 0)))
{
    if(c == -1)
    {
       cout<<"Error";
       break;
    }   
    else if(c == 0)
        break;
    tmp.append(buf.begin(), buf.begin()+c);
}

请注意,为了简单和可读性(特别是daemonize的代码并创建实际的AF_UNIX套接字(两者都成功)),代码大大减少了。)

更新

我可以验证客户端recv()调用永远不会返回,这意味着守护程序端send()调用正在挂起。为什么呢?

2 个答案:

答案 0 :(得分:0)

我没有看到守护进程recv()循环结束的任何原因。如果套接字仍处于打开状态,为什么recv()会返回0或-1?

您应该了解客户端何时完成在应用程序级别上发送数据,内容应该清楚,然后完成recv()循环并继续到服务器的send()部分。

答案 1 :(得分:-1)

好的,解决方案非常简单 @selalerer对recv()的返回值是正确的,这导致了这个有用的代码片段:

while((c = recv(fd, (char*)&buf[0], bufferSize, 0)))
{
    if(c == -1)
        /* handle error */
    tmp.append(buf.begin(), buf.begin()+c);

    if(c < bufferSize)
        //no more to read, therefore stop reading
        break;
}