gpt4 book ai didi

c++ - Unix 域套接字 (C++) - 客户端使服务器守护进程崩溃

转载 作者:IT王子 更新时间:2023-10-29 00:44:31 24 4
gpt4 key购买 nike


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

守护进程 self 守护,创建套接字甚至处理消息(我可以通过我创建的日志条目进行验证)但是一旦我尝试将答案发送给客户端,守护进程就被阻止了;客户端永远不会收到答复,如果我 ctrl-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() 是强制性的,但我认为它与缓冲区有关,缓冲区在读取时被清空...
但这只是我的假设!

关于c++ - Unix 域套接字 (C++) - 客户端使服务器守护进程崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29840757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com