【发布时间】:2014-09-15 10:41:37
【问题描述】:
我想将数据从 PC-01 发送到 PC-B,两台连接到互联网的计算机。可以用c#编写socket程序吗?我尝试搜索很多,所有大多数示例都在本地计算机上或使用静态 IP 地址。
计算机 1 -> 互联网服务提供商(IP:116.203.188.231) -> 宽带路由器 -> PC-01/PC-02
计算机 2 -> 互联网服务提供商(IP:49.202.72.175) -> 宽带路由器 -> PC-A/PC-B
我试试这个:
在服务器上:
m_socListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 8000);
m_socListener.Bind(ipLocal);
m_socListener.Listen(4);
m_socListener.BeginAccept(new AsyncCallback(OnClientConnect), null);
在客户端:
m_socClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(49.202.72.175);
int iPortNo = System.Convert.ToInt32(8000);
IPEndPoint ipEnd = new IPEndPoint(ip.Address, iPortNo);
m_socClient.Connect(ipEnd);
EnableCommands(false);
//watching for data
上面的代码没有问题,但它不起作用。尝试连接时说“无法建立连接,因为目标机器主动拒绝了它”。
我检查了防火墙并允许两个系统的应用程序和端口。
连接电脑的IP为:116.203.188.231,另一台电脑的IP为49.202.72.175。 IP 49.202.72.175 由 ISP 提供(它不是静态 ip,也可能由 isp 端的其他用户共享),并且超过使用本地局域网通过 49.202.72.175 连接到互联网的计算机。那么我可以使用套接字连接计算机吗?或者有什么技术可以连接两台电脑?
提前致谢。
【问题讨论】:
-
通常端口
8000被系统防火墙阻止。尝试在两台机器上使用非阻塞端口或打开防火墙。 -
你必须在你的路由器上配置端口转发(在监听端)
-
“是否可以用 c# 编写套接字程序?” - 是的。 “或者有什么技术可以连接两台电脑?” - 是的。但是请从小事做起,在您自己的计算机上使用两个程序,然后拿起一本关于基本网络的书来学习识别和解决此类问题。绝对是端口转发。
-
鉴于您使用的语言,您不太可能想要使用原始套接字。你在做RTC吗?您是否使用自定义协议?您是否正在尝试实现低延迟?如果您不能对所有这些回答是,请查看 WCF 或其他 IPC 框架。
-
感谢所有 cmets 并为迟到的回复感到抱歉。 @cackharot我也尝试了其他端口并且还禁用了防火墙,我可以连接但是当发送数据时说“现有连接被远程主机强制关闭”。