在连接到同一网络的远程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!");
}
}
当我在我的机器上运行时,一切都完美无缺,但当我尝试远程操作时,它会失败;但是,由于我能够从客户端向服务器发送消息,反之亦然,我对此感到困惑。
感谢。
答案 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