Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#插座问题_C#_Sockets_Tcp - Fatal编程技术网

C#插座问题

C#插座问题,c#,sockets,tcp,C#,Sockets,Tcp,我用一根电缆连接到电脑,试图模拟服务器\客户端。服务器在特定端点开始侦听,有时稍后客户端会连接。一切进展顺利,我决定一个连接(端口)的最高速度约为24Mbps。 因此,现在我颠倒了角色,无法获取连接Socket.BeginConnect(ServerEndPoint,新的AsyncCallback(OnConnectionCallback),\u ClientSocket)超时,并将localEndpoint设置为0.0.0.0 以下是客户端的代码: public void ConnectToS

我用一根电缆连接到电脑,试图模拟服务器\客户端。服务器在特定端点开始侦听,有时稍后客户端会连接。一切进展顺利,我决定一个连接(端口)的最高速度约为24Mbps。
因此,现在我颠倒了角色,无法获取连接
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不幸的是,有太多可能的原因。它甚至可能是一台机器上的服务器缺少的先决条件。您的异常处理实际上可能会因为吞咽问题而妨碍信息的获取。我最好的建议是删除它们或者用一个简单的
抛出来填充它们顺序,这样你就能看到一些东西。