【发布时间】:2011-08-31 14:21:30
【问题描述】:
我正在开发一个将数据流 TCP 套接字打开到另一个的应用程序。 连接打开并被服务器接受后,我发送一条“登录”消息,服务器成功接收到该消息,服务器尝试发送一条“成功”消息。这就是事情变得奇怪的地方。
服务器上的写入失败,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" */
}
谢谢!
附: - 很抱歉在问题本身中回复 cmets,但我在创建帐户之前创建了问题,并且不允许添加 cmets。
【问题讨论】:
-
您需要向我们展示您的客户端源代码。
-
你确定没有人打电话给
close或shutdown吗?你能给我们看一下捕获文件吗? -
poll永远不应返回 -1 错误码为ECONNREFUSED。在没有设置 errno 的情况下,它可能返回 0;它只是从以前的一些系统调用中遗留下来的。尝试在strace下运行客户端,以确保调用顺序和错误正确。
标签: c sockets connection