我目前正试图获得通过AF_UNIX
插座并运行的客户端/守护通信。C++ - 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
套接字(这两个都是成功的))。
UPDATE:
我可以验证客户端recv()
呼叫不会被恢复,这意味着守护方send()
电话挂。为什么?
客户端之后将消息发送给你的代码,看来它关闭套接字。那将使'发送() '失败 –
不,它不。不幸的是,这并不是那么简单(; –
与论坛网站不同,我们不使用“谢谢”或“任何帮助表示赞赏”,或对[so]进行签名。请参阅“[应该'嗨','谢谢''标语和称呼从撤职?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts)。 –