Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本C服务器:连接被拒绝错误_C_Sockets_Networking_Tcp - Fatal编程技术网

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

基本C服务器:连接被拒绝错误,c,sockets,networking,tcp,C,Sockets,Networking,Tcp,我有一个程序,它应该在端口62085接受一个连接并发送回一条测试消息。代码挂起在accept()处,即使客户端尝试连接,也不会返回。为什么服务器拒绝连接?这可能是防火墙问题吗 这段代码在OSX10.8.3下编译时适用,但在Oracle Enterprise Linux上运行时拒绝连接accept()将永远不会接受连接,并且从另一个设备到端口的telnet会出现连接被拒绝的错误。下面是netstat的输出,它证明程序实际上正在侦听我想要的端口。我尝试了其他端口,62084、666和8080,以查看

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

这段代码在OSX10.8.3下编译时适用,但在Oracle Enterprise Linux上运行时拒绝连接
accept()
将永远不会接受连接,并且从另一个设备到端口的telnet会出现连接被拒绝的
错误。下面是netstat的输出,它证明程序实际上正在侦听我想要的端口。我尝试了其他端口,62084、666和8080,以查看是否有什么东西阻塞了该特定端口。(netstat输出来自两个不同的命令)

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服务器都在同一个网络上运行,因此我不明白为什么在执行
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");
    }
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义待办事项10
#定义端口“62085”
void main(){
cli_addr中的结构sockaddr_;
袜子尺寸;
结构addrinfo提示,*res,*p;
int sockfd、new_fd;
memset(&hints,0,sizeof(hints));
hints.ai_family=AF_INET;//使用IPv4
hits.ai_socktype=SOCK_流;
hits.ai_flags=ai_PASSIVE;//为我填写我的IP
if(getaddrinfo(NULL、端口、提示和res)!=0){
syslog(LOG_ERR,“getaddrinfo()错误”);
出口(1);
}
for(p=res;p!=NULL;p=p->ai_next){
if((sockfd=socket(p->ai_系列,p->ai_socktype,p->ai_协议))=-1){
syslog(LOG_ERR,“创建套接字时出错”);
继续;
}
int yes=1;
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int))=-1){
syslog(LOG_ERR,“错误设置套接字选项”);
出口(1);
}
如果(绑定(sockfd,p->ai_addr,p->ai_addrlen)=-1){
关闭(sockfd);
syslog(LOG_ERR,“错误绑定套接字”);
继续;
}
打破
}
if(p==NULL){
关闭(sockfd);
syslog(LOG_ERR,“错误绑定套接字”);
出口(1);
}
freeaddrinfo(res);//释放不再使用的内存
如果(侦听(sockfd,BACKLOG)=-1){
关闭(sockfd);
syslog(LOG_ERR,“错误侦听”);
出口(1);
}
系统日志(日志信息,“等待连接”);
地址大小=sizeof(cli\u addr);
if(new_fd=accept(sockfd,(struct sockaddr*)&cli_addr,&addr_size)=-1){
syslog(LOG_ERR,“错误接受连接”);
}
}

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

证明是iptables,发出
服务停止iptables
允许代码工作。我最终在iptables中添加了以下规则:


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

你能把这句话当作一个问题吗?你能把代码格式化以便它编译吗?添加了include等。它现在应该可以编译并在除Windows以外的任何设备上工作(Windows网络依赖于不同的功能)操作系统中的什么可能导致这种情况?我检查了SELinux日志,发现里面什么都没有,既然iptables不是罪魁祸首,那还有什么呢?我打赌这是防火墙/路由器的问题。如果您绑定到xxx.xxx.xxx.xxx,而不是0.0.0.0,您是否仍然有相同的错误?@user2340872您绝对确定它不是iptables吗?你检查过sudo iptables-t mangle-L了吗?@thuovila在我的问题中添加了命令的输出,似乎这不是由于iptables@RemyLebeau还尝试绑定到IPv4地址,同一连接被拒绝错误。
#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");
    }
}