我的服務器程序旨在監聽所有接口,並且它也在監聽。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中。
請讓我知道您的意見。
感謝, 娜迦
你可以發佈代碼來顯示你的程序如何綁定你的套接字。 –
謝謝,我已經把代碼。 – Naga