我正在开发一个将数据流TCP套接字打开到另一个的应用程序。 连接打开并被服务器接受后,我发送服务器成功接收的“登录”消息,服务器尝试发送“成功”消息。这就是事情变得怪异的地方。
服务器上的写入失败,并且errno设置为“Broken pipe”。 客户端轮询文件描述符,等待数据读取也失败。在它上面,errno设置为“Connection refused”。
环回设备上的所有连接都是TCP。 使用tcpdump,我可以看到FIN从客户端发送到服务器。 它可以找到here。
如果连接已经建立,错误怎么能“连接被拒绝”? 什么可能导致这种行为?客户端代码是同步的,没有任何线程,没有其他人可以访问文件描述符。
如果重要,服务器就是Asterisk经理。
客户端代码的片段(真实代码有错误检查,分离的功能等):
struct sockaddr_in sa;
int fd;
fd = sock_socket(SOCK_STREAM, 0, 0);.
MZERO(sa);
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr("127.0.0.1");
sa.sin_port = htons(MANAGER_PORT);
connect(fd, (struct sockaddr *)&sa, sizeof(sa));
sprintf(buf,
"Action: Login\r\n"
"Username: %s\r\n"
"Secret: %s\r\n"
"Events: %s\r\n"
"ActionID: %d\r\n"
"\r\n",
MANAGER_USERNAME, MANAGER_PASSWORD, events, manager_action_id++)
write(fd, buf, strlen(buf));
{
struct pollfd fds = {fd, POLLIN, 0};
if (poll(&fds, 1, timeout) <= 0)
return -1; /* This is where the client fails with "Connection refused" */
}
谢谢!
P.S。 - 很抱歉回复问题内部的评论,但我在创建帐户之前创建了问题,但我不允许添加评论。
答案 0 :(得分:0)
关于“Broken Pipe”,我猜你试图在一个封闭的套接字中写一些东西,所以在这种情况下释放一个SIG_PIPE信号.Declare <signal.h>
并以某种方式安装信号操作,如signal(SIG_PIPE,SIG_IGN)