sockets - Solaris - 我的进程监听所有接口(interface),但其他进程监听本地主机 :6011

标签 sockets tcp network-programming solaris tcplistener

我的服务器程序被设计为监听所有接口(interface),它也在监听工作。

一种奇怪的行为正在发生。这意味着端口与 sshd 进程冲突。因为我需要让我的应用程序和 sshd 监听相同的端口范围。(例如:6000 - 6100)

MyProg代码:

   MyPort = 6011;

   #if TARGET_HAS_IPV6_SUPPORT

   /* IPv6 socket */
   {

        struct addrinfo *ai = NULL;

        r = ipw_getaddrinfo("::", NULL, AF_INET6, SOCK_STREAM, IPPROTO_TCP, AI_PASSIVE, &ai);
        if (r == 0)
        {
          Create_listen_socket(&ai, IpcMyPort);
        }
    }
   #endif

    {
        struct addrinfo ailocal = { 0 };
        struct sockaddr_in sin = { 0 };

        sin.sin_family = AF_INET;
        sin.sin_addr.s_addr = htonl(INADDR_ANY);
        ailocal.ai_family = AF_INET;
        ailocal.ai_socktype = SOCK_STREAM;
        ailocal.ai_protocol = IPPROTO_TCP;
        ailocal.ai_flags = AI_PASSIVE;
        ailocal.ai_addrlen = sizeof(struct sockaddr_in);
        ailocal.ai_addr = (struct sockaddr *)&sin;
        Create_listen_socket(&ailocal, MyPort);
    }


Create_listen_socket(struct addrinfo *ai,
                     unsigned int MyPort)
{

    SOCKET fd = INVALID_SOCKET;

    while (ai != NULL)
    {
        fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
            if (fd == INVALID_SOCKET)
            {
                Exit()
                break;
            }

            switch (switch (sa->sa_family)
            {
                case AF_INET:
                {
                    struct sockaddr_in *sin = (struct sockaddr_in *)sa;
                    sin->sin_port = htons((unsigned short)port);
                }
                break;

                #if TARGET_HAS_IPV6_SUPPORT 
                case AF_INET6:
                {
                    struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
                    sin6->sin6_port = htons((unsigned short)port);
                }
                break;

                #endif 
            }

            if (ipw_bind(fd, ai->ai_addr, ai->ai_addrlen) < 0)
            {

               exit();
               Break;
            }
            else
            {

                r = ipw_listen(fd, IPC_MAX_LISTEN_COUNT);
             }

        ai = ai->ai_next;
    }
}

以下是“sudo lsof -i -P | grep :60”的输出


::::::

sshd 23038 fin22495 11u IPv4 0x60026f7c740 0t0 TCP 本地主机:6011(听)

myProg 23108 root 4u IPv6 0x60026e46000 0t0 TCP *:6011 (听)

myProg 23108 root 5u IPv4 0x6002658e3c0 0t0 TCP *:6011 (听)


如果您看到,sshd 守护程序正在监听相同的端口 6011,但在本地主机接口(interface)上。但我的程序正在监听 *.6011。

如何确保 myProg 与 *:6011 一起监听“localhost:6011”,如果已经有一些进程正在监听“localhost:6011”,如何检测它。它发生在 Solaris 中。

请让我知道您的看法。

谢谢, 娜迦

最佳答案

我不确定您在这里做了什么,因为 sshd 通常应该监听端口 22,而不是 6011。打开端口的第一个进程将获得独占访问权限。这样做有充分的、与安全相关的原因。有关详细信息,请参阅 tcp(7P) 联机帮助页 - 查找 SO_REUSEADDR 和 SO_EXECLBIND。

关于sockets - Solaris - 我的进程监听所有接口(interface),但其他进程监听本地主机 :6011,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597583/

相关文章:

C套接字编程——printf不在屏幕上打印任何东西

qt - 通过 Wifi 的简单 TCP 通信太慢(秒延迟)?

C - 如何确定 JSON 消息的字节数

Android:如何检测设备是 WiFi 还是 WiFi+Cellular

c# - 流式传输桌面的最快方法是什么?

python - C++ 服务器无法通过套接字从 python 客户端读取我的消息

java - 如何使用 Spring Cloud Stream 应用程序启动器 TCP 处理消息

c++ - 同一端口上的 WinSock 重新托管无法正常工作 C++

android - 在部署之前测试服务器端代码

c++ - 用于构建 Web 协议(protocol)的资源