Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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
在systemd运行的网络服务器中调用accept()后。Netstat没有';我没有表现出我的服务_C_Linux_Sockets_Network Programming_Systemd - Fatal编程技术网

在systemd运行的网络服务器中调用accept()后。Netstat没有';我没有表现出我的服务

在systemd运行的网络服务器中调用accept()后。Netstat没有';我没有表现出我的服务,c,linux,sockets,network-programming,systemd,C,Linux,Sockets,Network Programming,Systemd,我不确定以前是否有人问过这个问题。 systemd在我的Linux服务器(3.14.39)上提供了一个运行良好的服务。 现在,我想添加一个函数,创建一个线程,并启动一个小型网络服务器,监听端口6666。 简单地说 memset(&server_addr,0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htons(INADDR_ANY);

我不确定以前是否有人问过这个问题。 systemd在我的Linux服务器(3.14.39)上提供了一个运行良好的服务。 现在,我想添加一个函数,创建一个线程,并启动一个小型网络服务器,监听端口
6666
。 简单地说

   memset(&server_addr,0, sizeof(server_addr)); 
   server_addr.sin_family = AF_INET;
   server_addr.sin_addr.s_addr = htons(INADDR_ANY);
   server_addr.sin_port = htons(6666);

   server_socket = socket(PF_INET,SOCK_STREAM,0);
   setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
   bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr));
   listen(server_socket, 10);
   new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
以上所有调用都成功返回,程序似乎在等待客户端连接

然而,当我使用
netstat-a
检查我的服务器状态时,什么都没有! 我也不能通过telnet连接到套接字

 netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
tcp        0      0 :::5355                 :::*                    LISTEN
tcp        0      0 :::80                   :::*                    LISTEN
tcp        0      0 :::22                   :::*                    LISTEN
tcp        0      0 :::443                  :::*                    LISTEN
tcp        0      0 :::6556                 :::*                    LISTEN
我做了一个实验来提取相同的C子程序,并将其构建为一个独立的可执行服务器程序,然后在系统启动后运行它。一切正常。。。。所以我想这不是编码错误,防火墙

我还检查了
lsof-ni
,可以看到我的服务器和套接字信息

root@:lsof -ni |grep 25199
316  /usr/sbin/test   socket:[25199]
希望我自己清楚。。 我只是没有线索和方向如何调试这个。有人知道我现在可以做什么或检查什么吗?甚至建议一份文件也会有帮助! 谢谢


添加更多信息

1. ping 127.0.0.1 is ok so I guess LO is up

    root@:~# ping 127.0.0.1
    PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
    64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.050 ms
    64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.066 ms
    64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.053 ms
    64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.042 ms
    64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.041 ms
  • 我怀疑我的服务可能在网络启动之前启动,因此我在systemd单元文件中添加了network-online.target。但它也不起作用

    After=network-online.target


  • 在注释中粘贴代码似乎效果不好。我的绑定地址初始化代码如下

       memset(&server_addr,0, sizeof(server_addr)); 
       server_addr.sin_family = AF_INET;
       server_addr.sin_addr.s_addr = htons(INADDR_ANY);
       server_addr.sin_port = htons(6666);
    
    问题解决了,, 结果是网络名称空间问题

    不知何故,我得到的systemd服务加入了另一个名为“xxns”的网络名称空间。 虽然netstat只列出默认的ns状态,但我看不到端口6666。 使用下面的命令,我可以看到端口状态

    ip netns exec xxns netstat -ant
    
    Telnet也与

    ip netns exec xxns telnet 127.0.0.1 6666
    

    因为我以前从未使用过linux名称空间,所以我的调试方向完全不正确,我上面提供的信息也没用…

    “…程序似乎在等待客户端连接。”如何验证这一点?初始化绑定地址的代码在哪里?你好,感谢您的回复。在调试此问题时,我在bind()之前和之后添加了日志。我可以在bind()打印之前看到日志,但是在bind()打印之后没有看到日志。嗨,EJP,谢谢。绑定地址初始化代码是memset(&server_addr,0,sizeof(server_addr));服务器地址sin家庭=AF网络;服务器地址sin地址s地址=htons(INADDR\U ANY);服务器地址sin端口=htons(6666);对不起,伙计们。但我对stackoverflow还是个新手。只需在第一篇文章中添加我的初始化代码。你应该将它粘贴到你的问题中,它应该放在第一位。在第一篇文章中添加。