C++ - AF_UNIX socket hangs

C++ - AF_UNIX socket hangs

本文关键字:socket hangs UNIX AF C++      更新时间:2023-10-16

我目前正试图通过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()调用挂起了。为什么?

我看不出守护进程端recv()循环会结束的任何理由。如果套接字仍然打开,为什么recv()会返回0或-1 ?

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

好的,解决方案很简单。
@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;
}