套接字问题,客户端声称它无法连接,但服务器说它做到了

时间:2016-07-04 21:24:59

标签: c# sockets tcp

在连接到同一网络的远程PC上运行服务器时,我遇到了问题。

我设法将客户端连接到服务器,但是客户端抛出异常,说它无法打开套接字;但是,在服务器端,我看到客户端确实连接了,我可以从客户端向服务器发送消息,但不能从服务器发送到客户端。

这是启动服务器的服务器端。

private void StartServer()
    {
        try
        {
            _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _serverSocket.Bind(new IPEndPoint(IPAddress.Parse("192.168.5.150", 3333));
            _serverSocket.Listen(5);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
            textBox.Text += "Waiting for connections\r\n";
        }
        catch (SocketException ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

我已经在路由器中打开了3333 UDP / TCP以及该IP的端口。

这是客户端连接代码。

void Connect()
{
            try
            {
                _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _clientSocket.BeginConnect(new IPEndPoint(IPAddress.Parse("192.168.5.150"), 3333), new AsyncCallback(ConnectCallback), null);

                _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), _clientSocket);
                AppendToTextBox("Connected!");
            }
            catch
            { 
                MessageBox.Show("Failed to open socket!");
            }
}

当我在我的机器上运行时,一切都完美无缺,但当我尝试远程操作时,它会失败;但是,由于我能够从客户端向服务器发送消息,反之亦然,我对此感到困惑。

感谢。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是gulp.task("node server/app.js && echo 'start'", function(cb) { serverProcess.stdout.on("data", function(data) { if(data.toLowerCase().includes("start")) { return cb(); } }); }); 会引发异常。这是因为BeginReceive还没有准备好。

它可能会运行localhost,因为在调用BeginConnect之前BeginConnect可以准备就绪,但我不会打赌它。

会起作用:

BeginReceive

您必须在_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _clientSocket.BeginConnect(new IPEndPoint(IPAddress.Parse("192.168.5.150"), 3333), new AsyncCallback(ConnectCallback), null); _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), _clientSocket); AppendToTextBox("Connected!"); 之后/之后拨打BeginReceive。此外,您不能假设在调用BeginReceive后,套接字是直接连接的。

应该是这样的:(PSEUDO)

ConnectCallback