套接字问题,客户端声称连接失败,但服务器说连接成功
本文关键字:连接 服务器 成功 失败 问题 客户端 套接字 | 更新日期: 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.
}