C - 已打开的套接字上的“连接被拒绝”

时间:2011-08-31 14:21:31

标签: c sockets connection

我正在开发一个将数据流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。 - 很抱歉回复问题内部的评论,但我在创建帐户之前创建了问题,但我不允许添加评论。

1 个答案:

答案 0 :(得分:0)

关于“Broken Pipe”,我猜你试图在一个封闭的套接字中写一些东西,所以在这种情况下释放一个SIG_PIPE信号.Declare <signal.h>并以某种方式安装信号操作,如signal(SIG_PIPE,SIG_IGN)