C#插座问题
我用一根电缆连接到电脑,试图模拟服务器\客户端。服务器在特定端点开始侦听,有时稍后客户端会连接。一切进展顺利,我决定一个连接(端口)的最高速度约为24Mbps。C#插座问题,c#,sockets,tcp,C#,Sockets,Tcp,我用一根电缆连接到电脑,试图模拟服务器\客户端。服务器在特定端点开始侦听,有时稍后客户端会连接。一切进展顺利,我决定一个连接(端口)的最高速度约为24Mbps。 因此,现在我颠倒了角色,无法获取连接Socket.BeginConnect(ServerEndPoint,新的AsyncCallback(OnConnectionCallback),\u ClientSocket)超时,并将localEndpoint设置为0.0.0.0 以下是客户端的代码: public void ConnectToS
因此,现在我颠倒了角色,无法获取连接
Socket.BeginConnect(ServerEndPoint,新的AsyncCallback(OnConnectionCallback),\u ClientSocket)
超时,并将localEndpoint设置为0.0.0.0
以下是客户端的代码:
public void ConnectToServer(IPAddress iPAddress, int Port)
{
connected.Reset();
IPEndPoint ServerEndPoint = new IPEndPoint(iPAddress, Port);
try
{
_ClientSocket = new Socket(iPAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
_ClientSocket.BeginConnect(ServerEndPoint, new AsyncCallback(OnConnectCallback), _ClientSocket);
connected.WaitOne();
// Here I would like to start async receiving but there's no connection
}
catch (SocketException)
{
// TODO:
}
}
private void OnConnectCallback(IAsyncResult result)
{
try
{
Socket client_StateSocket = (Socket)result.AsyncState;
client_StateSocket.EndConnect(result);
/// Here I get 0.0.0.0
connected.Set();
}
catch (SocketException)
{
// TODO:
}
}
服务器主要来自MSDN示例。它开始监听传入的连接,在循环时进入永久的,并等待套接字。BeginAccept
触发(但从未触发)。
我怀疑是防火墙,但这两台电脑上的设置看起来都一样,而且反向工作正常,那么可能是什么问题呢?当您开发服务器/客户机体系结构时,通常只要让它们在同一台机器上运行,并让它们通过环回IP地址进行通信就足够了。一般来说,网络代码并不关心另一端是否在同一台计算机、同一台交换机或旅行者2号探测器上(当然,他们确实关心一点,因为延迟相当高)
如果您在部署/测试中遇到问题,那么您将以99%的概率处理网络问题,而不是编程问题。有时会有一些必需的更改(例如公开设置代理设置的选项)。但调试首先是一个网络操作
我的第一个猜测是防火墙(包括内置在Windows中的防火墙)。然后是类似于防火墙的东西,如NAT层。客户端和侦听器不能同时具有三个属性1)源IP 2)目标IP 3)端口号。所以,当客户端和服务器在同一台机器上时,必须让服务器在IP上侦听。然后让客户端连接到机器的IP地址(或机器名)。解决这个问题的最佳方法是什么?Ping工作正常,PC作为服务器工作时可以成功发送数据。但是当它作为一个客户端时,它似乎甚至没有启动连接。我找到了关于使用wireshark或类似产品的建议,但我没有这方面的经验。内置Windows性能监视器仅在中的TCP连接中显示它grey@Leinad:要么是防火墙挡住了去路(可能是单边代理设置)。或者在两台机器之间有一层NAT。NAT(就像您在路由器中找到的一样)允许接收请求的答案,同时忽略所有意外流量。制作一个可以从Internet访问的Web服务器主要是为了绕过NAT。PC通过以太网电缆直接连接,我可以从控制台用指定的IP ping每个PC。通常(据我所知),本地端口是@Christopher:在连接到RemoteEndpoint时自动选择的。我试着把它捆起来,但还是没用。在这两台电脑的防火墙上,服务器和客户端应用程序都具有完全权限。发送请求(从PC)或允许它(在笔记本电脑上)是一个问题吗?@Leinad不幸的是,有太多可能的原因。它甚至可能是一台机器上的服务器缺少的先决条件。您的异常处理实际上可能会因为吞咽问题而妨碍信息的获取。我最好的建议是删除它们或者用一个简单的抛出来填充它们代码>顺序,这样你就能看到一些东西。