我正在尝试通过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()
调用正在挂起。为什么呢?
答案 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;
}