2011-09-29 42 views
1

我的服務器程序旨在監聽所有接口,並且它也在監聽。Solaris - 我的進程監聽所有的接口,但監聽本地主機上的其他進程:6011

一個奇怪的行爲正在發生。這意味着與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; 
    } 
} 

以下是「命令lsof的-i -P輸出| grep的:60"


:: :: ::

sshd的23038 fin22495 11U的IPv4 0x60026f7c740 0t0 TCP 本地主機:6011(LISTEN)

MYPROG 23108根的4U的IPv6 0x60026e46000 0t0 TCP *:6011 (LISTEN)

MYPROG 23108根,5μ的IPv4 0x6002658e3c0 0t0 TCP *:6011 (LISTEN)


如果你看到,sshd的守護進程正在監聽同一端口6011,但在本地主機接口上。但我的程序正在* .6011上收聽。

如何確保myProg與*:6011一起在「localhost:6011」上偵聽,並且如果已經有一些進程正在偵聽「localhost:6011」如何檢測它。它發生在Solaris中。

請讓我知道您的意見。

感謝, 娜迦

+0

你可以發佈代碼來顯示你的程序如何綁定你的套接字。 –

+0

謝謝,我已經把代碼。 – Naga

回答

1

我不知道你在這裏做什麼,因爲sshd的一般應在22端口偵聽,不是6011的第一個進程打開的端口將獲得獨佔訪問。這是很好的,與安全有關的原因。有關詳細信息,請參閱tcp(7P)聯機幫助頁 - 查找SO_REUSEADDR和SO_EXECLBIND。

+0

我們編輯了sshd_config並將ssh端口改爲了6011 – Naga

0

如果您看到,sshd守護進程正在偵聽同一個端口6011,但在本地主機接口上偵聽。但我的程序正在* .6011上收聽。

如何確保myProg與*:6011一起在「localhost:6011」上偵聽,並且如果已經有一些進程正在偵聽「localhost:6011」如何檢測它。它發生在Solaris中。

您的應用程序的端口號與ssh X-forwarding使用的端口衝突。改變你的端口號碼並完成。

+0

我向你解釋過,如果一個進程(即sshd)正在監聽一個地址+端口,你就不能在另一個進程中重新打開同一個地址+端口。如果你想檢測它,明確地打開地址+端口而不是通配地址。 –