C++ - AF_UNIX socket hangs
C++ - AF_UNIX socket hangs
我目前正试图通过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;
}
相关文章:
- C/C++:socket() 创建在循环中失败,打开的文件太多
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- 通过 Tor 服务C++ socket.io 客户端
- XInputGetState hangs
- Ncurses CTRL + s hangs getch()
- 操作系统 (Linux) 在使用 boost::asio::generic::raw_protocol::socket
- Make zmqpp::socket::connect a std::future
- 为什么可以重复使用这个boost::asio::tcp::socket
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- Socket.io客户端C++,从Socket.on获取数组
- 调用socket.remote_endpoint(提升 asio 库)线程安全性
- 如何使用已经存在的 tcp::socket 创建 tcp::iostream?
- 节点.js到 c++ 客户端:不接收来自 socket.emit 的消息
- 将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 时出错?
- 我可以在不包含 <sys/socket.h> 的情况下使用 C 套接字吗?
- 如何使用C 在socket.io中接收数据
- 通过 Socket 通过 boost asio 发送和接收 protobuf 数据
- shutdown() 和 closesocket() 在 SOCKET 上的 send() 之后不久
- 尝试在 Kdevelop中调试时如何修复"WebConnect: Starting server failed. Try to remove stale socket."?
- C++ - AF_UNIX socket hangs