首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基本C服务器:连接被拒绝错误

基本C服务器:连接被拒绝错误
EN

Stack Overflow用户
提问于 2013-05-02 05:13:58
回答 2查看 2.3K关注 0票数 3

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

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

代码语言:javascript
复制
   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显示,它还允许在所有端口上进行连接。

代码语言:javascript
复制
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的输出是

该命令输出为

代码语言:javascript
复制
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设备和Enterprise Linux Server都运行在同一个网络上,所以我搞不懂为什么在执行telnet XXX.XXX.XXX.XXX 62085时会收到Connection Refused错误。

相关代码如下:

代码语言:javascript
复制
#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");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-03 02:18:42

原来是iptables,发出service stop iptables允许代码正常工作。我最终将以下规则添加到iptables中:

sudo iptables -I INPUT 5 -m state --state NEW -m tcp -p tcp --dport 62085 -j ACCEPT

票数 0
EN

Stack Overflow用户

发布于 2013-05-02 16:33:36

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16326628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档