C - "Connection refused"在一个已经打开的套接字上

标签 c sockets connection

我正在开发一个向另一个打开数据流 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" */
}

谢谢!

附言- 很抱歉在问题本身内回复评论,但我在创建帐户之前创建了问题,不允许我添加评论。

最佳答案

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

关于C - "Connection refused"在一个已经打开的套接字上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7258364/

相关文章:

c - 使程序在 C 中线性运行

c++ - 在 Visual Studio 2010 (utility.obj) 中使用带有 VC++ 的 QuickFix 时出错

android - 如果在 Android 中连接 BLE 设备失败,如何通知用户?

java - URLConnection.getInputStream() : Connection timed out

c - 这个c函数的复杂度是多少

arrays - 读取文件并在 C 中打印内容

c - RSA_private_decrypt 返回 -1

node.js - Sailsjs 错误 : Cannot write to response more than once at onlyAllowOneResponse

python - Ruby 与 Python - 套接字库

tomcat - 在 EC2 实例上成功安装 tomcat 后,GUI 未加载 tomcat