Unix域套接字(C++)-客户端使服务器守护进程崩溃
Unix Domain Socket (C++) - Client crashes server daemon
我遇到了一个很大的问题
我最近开始了守护进程和套接字编程。我当前的设置由一个创建套接字的守护进程和一个写入消息并读取处理后的答案的客户端组成
嗯,应该阅读答案。
守护进程对自己进行守护,创建套接字,甚至处理消息(我可以通过我创建的日志条目进行验证),但一旦我试图向客户端发送答案,守护进程就会被阻止;客户端从未接收到应答,并且如果Ictrl-c
客户端,则守护进程也将关闭
这对我来说完全是一种奇怪的行为,我无法解释发生了什么,这就是为什么我问你任何暗示。
简要总结:
-套接字类型为AF_UNIX
,因此是本地的,不涉及网络
-守护进程成功接收到消息,但无法写回
–客户端无法读取(因为服务器的send()
正在阻塞)和如果我ctrl-c
客户端,守护进程也会退出(但该信号不会发送给守护进程)
下面是我的代码,精简到有趣且不起作用的部分
非常感谢您的提示、帮助和建议!
更新:
还添加了客户端代码!
int main()
{
//those two work just fine
createSocket();
daemonize();
//declare some variables needed in the big loop
FILE *client_fd;
int fd;
socklen_t len;
string tmp;
char *buf = new char[1024];
while(1)
{
struct sockaddr_un saun;
len = sizeof(saun);
//receive an fd for the incoming connection
if((fd = accept(m_socket, (sockaddr*)&saun, &len)) < 0)
{
writeLog("Accepting connection failed!");
continue;
}
//i wanted to use fgets, therefore obtain a FILE object here
client_fd = fdopen(fd, "r");
if(client_fd == NULL)
{
writeLog("fdopen() failed!");
continue;
}
while(fgets(buf, bufferSize, client_fd) != NULL)
{
//message read succeeds (verified)
writeLog(buf);
tmp = evaluateMsg(buf);
//tmp is not empty (verified)
writeLog(tmp);
//send seems to block, nothing happens from now on
//I don't even get in one of the if-else branches
if(send(fd, (tmp + "n").c_str(), tmp.size() + 1, 0) < 0)
{
writeLog("Could not write message back!");
continue;
}
else
writeLog("bytes written!");
}
close(fd);
}
}
以下是客户端代码:
int main()
{
int sockfd;
sockaddr_un addr;
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, SOCKET_PATH);
//the connection is successfull
if(connect(sockfd, (sockaddr*)&addr, sizeof(addr)) < 0)
{
cerr<<"Connection failed!"<<endl;
exit(1);
}
//message is written successfully
write(sockfd, "hello", 5);
char *buf = new char[1024];
//same as for the server, I wanted to use fgets
//therefore need to obtain a FILE object
FILE *fd = fdopen(sockfd, "r");
fgets(buf, 1024, fd);
cout<<buf<<endl;
close(sockfd);
}
好吧,我自己找到了解决方案。
问题是(方便的)呼叫fgets()
;我不得不使用read()
,现在一切都像一个符咒
我不知道为什么read()
是强制性的,但我认为这与缓冲区有关,缓冲区在读取时会被清空
但那只是我的假设!
相关文章:
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 从服务器传输到客户端的消息不会出现
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- OpenSSL TLS服务器-使用客户端证书白名单
- 我正在开发服务器,ip作为参数传递不起作用
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 如何在 Minecraft 服务器上执行命令
- Unix域套接字(C++)-客户端使服务器守护进程崩溃
- 从服务器套接字创建守护进程处理
- 在服务器上执行守护进程
- c++守护进程服务器停止
- 由于从客户端启动守护程序应用程序,服务器端口无法返回侦听并处于关闭等待状态
- 我不希望一个作为守护进程的服务器进程关闭——即使在收到终止信号时也是如此.有什么办法可以确保这一点吗
- 通用守护进程/服务器设计-最佳实践(C/ c++, Linux)
- 服务器守护程序的套接字停止工作
- 多线程/分叉服务器守护进程的模型