Unix域套接字(C ++) – 客户机崩溃服务器守护进程

我有一个很大的问题
我最近开始守护进程和套接字编程。 我当前的设置包含一个守护进程,它创build一个套接字和一个写入消息并读取处理后的答案的客户端。
那么, 应该阅读答案。

守护进程守护进程,创build套接字,甚至处理消息(我可以通过日志条目进行validation),但只要我尝试将答案发送给客户端,守护进程就被阻塞; 客户端永远不会收到答案,如果我ctrl-c客户端守护进程也被closures。
这对我来说是非常奇怪的行为,我无法解释发生了什么,这就是为什么我要问你任何提示。

小结:
– 套接字types是AF_UNIX ,因此本地和不涉及networking
– 守护进程成功接收消息,但不能回写
– 客户端无法读取(因为服务器的send()被阻塞),如果我ctrl-c客户端守护进程也退出(但该信号不会发送到守护进程)

下面是我的代码,剥离到有趣的,而不是工作的一部分。
非常感谢提示,帮助和build议!

更新:

添加了客户端代码!

 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()是强制性的,但是我认为它和缓冲区有关,只要它被读取就清空了。
但那只是我的假设!