gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:51:07 25 4
gpt4 key购买 nike

我在连接到同一网络的远程 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!");
}
}

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

谢谢。

最佳答案

您面临的问题是 BeginReceive 会引发异常。这是因为 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!");

您必须在 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.
}

关于c# - 套接字问题,客户端声称连接失败,但服务器说连接成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com