c - 基本 C 服务器 : Connection Refused Error

标签 c sockets networking tcp

我有一个程序应该接受端口 62085 上的连接并发回一条测试消息。代码卡在 accept() 并且永远不会返回,即使客户端尝试连接。为什么服务器拒绝连接?会不会是防火墙的问题?

此代码在 OS X 10.8.3 下编译时适用于我,但在 Oracle Enterprise Linux 上运行时拒绝连接。 accept() 将永远不会接受连接,并且从另一台设备远程登录到端口会出现 Connection Refused 错误。下面是 netstat 的输出,证明程序实际上正在监听我想要的端口。我尝试了其他端口,62084、666 和 8080,看看是否有东西阻塞了那个特定端口。 (netstat 输出来自两个不同的命令)。

   tcp        0      0 0.0.0.0:62085               0.0.0.0:*                   LISTEN      11815/del-chef  

   tcp        0      0 129.133.124.83:62085        0.0.0.0:*                   LISTEN      15101/del-chef  

iptables 显示它也允许所有端口上的连接。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:https 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:yo-main 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:terabase 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination`

sudo iptables -t mangle -L 的输出是

该命令的输出是

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

OS X 设备和 Enterprise Linux Server 都在同一个网络上运行,所以我很困惑为什么当我执行 telnet XXX.XXX.XXX.XXX 62085 我收到一个 连接被拒绝 错误。

相关代码如下:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include <fcntl.h>
#include <syslog.h>
#include <signal.h>

#define BACKLOG 10
#define PORT "62085"

void main() {
    struct sockaddr_in cli_addr;
    socklen_t addr_size;
    struct addrinfo hints, *res, *p;
    int sockfd, new_fd;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;  // use IPv4
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;     // fill in my IP for me

    if (getaddrinfo(NULL, PORT, &hints, &res) != 0){
        syslog(LOG_ERR, "getaddrinfo() error");
        exit(1);
    }
    for (p = res; p != NULL; p = p->ai_next){
        if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1){
            syslog(LOG_ERR, "Error creating socket");
            continue;
        }
        int yes = 1;
        if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1){
            syslog(LOG_ERR, "Error settings socket options");
            exit(1);
        }
        if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1){
            close(sockfd);
            syslog(LOG_ERR, "Error binding socket");
            continue;
        }

        break;    
    }
    if (p == NULL){
        close(sockfd);
        syslog(LOG_ERR, "Error binding socket");
        exit(1);
    }
    freeaddrinfo(res); // free memory now that it is no longer in use

    if (listen(sockfd, BACKLOG) == -1){
        close(sockfd);
        syslog(LOG_ERR, "Error listening");
        exit(1);
    }
    syslog(LOG_INFO, "Waiting for connections");
    addr_size = sizeof(cli_addr);
    if (new_fd = accept(sockfd, (struct sockaddr *)&cli_addr, &addr_size) == -1){
        syslog(LOG_ERR, "Error accepting connection");
    }
}

最佳答案

您显示的代码没有任何问题,因此问题出在您的应用之外。由于您的套接字显然正在监听并且 bas 尚未耗尽其积压,因此连接被拒绝错误必须意味着操作系统本身,或者可能/可能是防火墙/路由器,在连接到达您的应用程序之前拒绝连接。

关于c - 基本 C 服务器 : Connection Refused Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16326628/

相关文章:

c - mingw+libarchive : cross compiling linker error

c - 使用 3 轴加速度计和陀螺仪获取方向

c++ - WM_LBUTTONDOWN、WM_COMMAND 和 WM_CLOSE 等 Windows 消息在 win32 C/C++ API 中定义在哪里?

C++ TCP套接字垃圾值

java - Netty 的长度前缀框架 - 无法设置 LengthFieldPrepender/Decoder

c - 如何在C中实现链表?

c++ - 配置OpenWrt进行socket编程的问题

c++ - Socket C++ 程序编译成功在运行时崩溃

networking - 使用docker的weave网络驱动插件配置多个网络时出错

Java套接字 - 客户端不从服务器的套接字读取字符串