套接字问题,客户端声称连接失败,但服务器说连接成功

本文关键字:连接 服务器 成功 失败 问题 客户端 套接字 | 更新日期: 2023-09-27 17:54:34

我在连接到同一网络的远程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打开了一个端口。

客户端连接代码

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!");
            }
}

当我在我的机器上运行这两个程序时,一切都运行得很完美,但当我试图远程操作时,它就失败了;然而,由于我能够从客户端向服务器发送消息,而不是相反,我对此有点困惑。

谢谢。

套接字问题,客户端声称连接失败,但服务器说连接成功

您面临的问题是BeginReceive将引发异常。这是因为BeginConnect还没有准备好。

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

This is NOT gonna work:

_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!");

必须在ConnectCallback的/之后调用BeginReceive。你也不能假设在BeginReceive被调用后,套接字是直接连接的。


(PSEUDO)
public void Start()
{
    _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    _clientSocket.BeginConnect(new IPEndPoint(IPAddress.Parse("192.168.5.150"), 3333), new AsyncCallback(ConnectCallback), null);
}
public void ConnectCallback(IASyncResult state)
{
    // get the socket from the state etc.....
    AppendToTextBox("Connected!");
    clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), _clientSocket);
}
public void RecieveCallback(IASyncResult state)
{
    // check if you receive the bytes you are trying to read.
}