【发布时间】:2021-06-02 21:34:19
【问题描述】:
您如何获取 Web 服务器上请求的远程端口?
所以我的代码应该是这样的:
public class EndpointReflectionHandler : IHttpHandler
{
public new void ProcessRequest(HttpContext context)
{
string address = context.Request.UserHostAddress;
int port = context.Request.UserHostPort; //it's not there
context.Response.ContentType = "text/plain";
context.Response.Write(address + ":" + port);
}
}
..但是我找不到任何东西来获取端口。
编辑。感谢 Tim 的精彩评论:
这是完整的工作流程:
- 客户端启动,打开一个套接字
- 你好 webservice 我的 IP 和端口是什么?
- 它是 1.2.3.4:1234
- 嘿,其他人,我会在 1.2.3.4:1234 上收听(尽管对我来说它看起来像 9.9.9.9:9999
- 好的,我将连接到 1.2.3.4:1234
- 大家开心,喝杯啤酒
【问题讨论】:
-
如果你有这些信息,你会做什么?您无法与该端口通信。在今天的几乎所有情况下,这是一个仅在连接中有意义的 NAT 端口。你可以试试
context.Request.ServerVariables["REMOTE_PORT"],但效果不大。 -
嘿蒂姆。准确地说,它是 NAT。所以我的客户端软件甚至不知道它正在使用什么端口..尽管 IP 地址可用。你会如何解决这个问题?
-
检查myip.com 它有远程端口。那么为什么 C# 没有这种能力呢?
-
您的工作流程没有意义。你认为谁会在 1.2.3.4:1234 上收听?该 IP 映射到某处的网关路由器。它为特定的出站 HTTP 连接发明了端口号 1234,当该端口上有来自它建立的连接的流量时,它会在内部转发它。该端口上的其他流量被丢弃。您无法打开与它的新连接。
-
不,布拉。一个双向插座。它使用相同的套接字进行快速 webmethod 调用以获取端口号。然后保持打开状态,以便其他人可以连接到它。否则它怎么会知道它自己的端口? nat 会搞砸它并且永远不会告诉你(至少在 C# 中)外部端口号是什么......
标签: c# endpoint ihttphandler