我正在编写一个非常简单的.NET TCP Server
和一个非常简单的TCP Client
,它们都应在同一台计算机(Window 10家用PC)上运行并相互连接(仅用于测试目的)。
在服务器中,我以这种方式等待连接:
public static void StartListening()
{
string hostname = Dns.GetHostName();
IPHostEntry ipHostInfo = Dns.GetHostEntry(hostname);
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, Properties.Settings.Default.Port);
Socket listener = new Socket(
ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEndPoint);
listener.Listen(Properties.Settings.Default.Port);
while (true)
{
allDone.Reset();
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener);
allDone.WaitOne();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
}
public static void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
var frames = Directory.EnumerateFiles(Properties.Settings.Default.FramesPath);
foreach (string filename in frames)
{
Console.Write("Sending frame: {}...", filename);
SendFile(handler, filename);
Thread.Sleep(Properties.Settings.Default.FrameDelay);
}
}
在客户端中,我以这种方式创建连接:
private void startClient(string host, int port)
{
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(host), port);
ClientTCP = new TcpClient();
ClientTCP.Connect(serverEndPoint);
Reader = new StreamReader(ClientTCP.GetStream());
Listen = true;
listner = Listener();
}
startClient
以这种方式被调用。
startClient(txtAddr.Text, (int)int.Parse(txtPort.Text));
当我将客户端设置host
设置为当前计算机名称时(服务器检索到槽Dns.GetHostName()
时,我遇到了这个异常:
指定了无效的IP地址。
我尝试使用 127.0.0.1 并得到:
无法建立连接。永久拒绝目标计算机127.0.0.1:5002
我尝试过 localhost ,我得到
再次指定了无效的IP地址
。我尝试使用分配给WiFi的IP地址,然后又得到
无法建立连接。永久拒绝目标计算机192.168.10.11:5002
我确定计算机网络可以正常工作,因为我将其用于许多其他事情,包括连接到本地TCP服务,并且我确定客户端和服务器代码都可以正常工作,因为我可以在其他PC上进行连接将 localhost 设置为客户端host
变量值。为什么我无法在代码中使用回送连接?
我在哪里失败了?
P.S。我在Windows防火墙规则中允许连接到服务器二进制文件,也允许在客户端二进制文件中进行传出连接。
对于愿意在此处检查服务器代码的任何人来说,它是:
答案 0 :(得分:3)
您正在使用带有“ IPEndPoint”参数的构造函数。此构造函数不会自动连接到服务器,并且必须在使用套接字之前调用“ Connect”方法。这就是为什么您会收到错误消息“未连接的套接字上不允许进行操作”的原因。另外,您为客户端提供了错误的IPEndPoint。
请在客户端上尝试以下操作:
private void startClient(string host, int port)
{
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(host), port);
ClientTCP = new TcpClient();
ClientTCP.Connect(serverEndPoint);
Reader = new StreamReader(ClientTCP.GetStream());
Listen = true;
listner = Listener();
}
您可能需要在此处进行一些异常处理,但现在应该可以使用。
更新:
ipHostInfo.AddressList
可能有多个地址,而您想要的只是其中一个。它不一定是第一个。我手动指定了它,它可以起作用:
//string hostname = Dns.GetHostName();
//IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1");
//IPAddress ipAddress = ipHostInfo.AddressList[0];
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 5002);