我的服务器程序被设计成在所有的接口上侦听,并且它也在工作。
一种奇怪的行为正在发生。这意味着端口冲突与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 0x60026f7c7400t0 TCP本地主机:6011(听)
myProg 23108根4u IPv6 0x60026e460000t0 TCP *:6011 (听)
myProg 23108根5u IPv4 0x6002658e0c0t0 TCP *:6011 (听录音)
如果您看到,sshd守护进程正在侦听同一端口6011,但侦听本地主机接口。但我的节目正在收听*.6011。
如何确保myProg侦听"localhost:6011“和*:6011,如果已经有进程侦听"localhost:6011”,如何检测它。它发生在Solaris。
请告诉我你的看法。
谢谢你,纳加
发布于 2011-09-30 09:01:33
我不知道你在这里做了什么,因为sshd通常应该监听端口22,而不是6011。打开端口的第一个进程将获得独占访问。这是有好的、与安全有关的原因。有关详细信息,请参阅tcp(7P)手册-查找SO_REUSEADDR和SO_EXECLBIND。
发布于 2011-09-30 10:33:38
--如果您看到,sshd守护进程正在监听同一端口6011,但位于本地主机接口上。但我的节目正在收听*.6011。
如何确保myProg侦听"localhost:6011“和*:6011,如果已经有进程侦听"localhost:6011”,如何检测它。它发生在Solaris。
您的应用程序的端口号与ssh X转发使用的端口冲突。更改您的端口号并完成此操作。
https://stackoverflow.com/questions/7597583
复制相似问题