我正在开发一个将数据流TCP套接字打开到另一个套接字的应用程序。 连接打开并被服务器接受后,我发送一个“登录”消息,服务器成功接收到该消息,服务器尝试发送“成功”消息。这是奇怪的地方。C - 在已打开的套接字上“拒绝连接”
服务器上的写入失败,并将errno设置为“Broken pipe”。 客户机轮询文件描述符,等待数据读取,也会失败。在此errno被设置为“连接被拒绝”。
环回设备上的所有连接均为TCP。 使用tcpdump,我可以看到FIN从客户端发送到服务器。 可以发现here。
如果连接已建立,errno如何成为“连接被拒绝”? 什么可能导致此行为?客户端代码是同步的,没有任何线程,也没有其他人可以访问文件描述符。
如果重要,服务器是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. - 抱歉对问题内部的评论作出回应,但是我在创建帐户之前创建了问题,并且我不允许添加评论。
您需要向我们展示您的客户端源代码。 –
你确定没有人调用'close'或'shutdown'吗?你能告诉我们捕获文件吗? – cnicutar
'poll'不应该以errno'ECONNREFUSED'返回-1。它可能已经返回0,在这种情况下,errno没有设置;它只是从以前的系统调用中遗留下来。尝试在'strace'下运行客户端以确保调用和错误的顺序正确。 – mark4o