我无法连接以测试使用 TcpListener 启动的本地服务器
I can't connect to test a local server started with TcpListener
免责声明:这是我第一次涉足与 tcp/socket 直接相关的任何事情。我读过 -the- -following- -resources- 并试图提出一个非常简单的测试应用程序。
我正在尝试开发本地服务器 运行 TcpListener 对象。我可以很好地实例化它并 运行 netstat
以查看处于 LISTENING 状态的端口。但是,我无法通过 telnet 或创建测试客户端来手动连接。 Telnet 只是说它无法打开连接。尝试测试客户端应用程序抛出异常
An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
Additional information: Only one usage of each socket address (protocol/network address/port) is normally permitted
在thisSO问题中,提问者最终通过故障网卡解决了问题。我该如何查找?
这让我很困惑。我如何测试或连接到服务器?这是我的代码。
对于服务器:
using System;
using System.Configuration;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace TcpConsole
{
class Program
{
static void Main(string[] args)
{
var localPort = ConfigurationManager.AppSettings["localPort"];
var portNumber = int.Parse(localPort);
var maxConnections = ConfigurationManager.AppSettings["maxConnections"];
var maxConnectionsNumber = int.Parse(maxConnections);
Console.WriteLine("Preparing to start server on port {0}", portNumber);
Console.WriteLine("Max connections: {0}", maxConnectionsNumber);
var ipHostInfo = Dns.GetHostEntry("localhost");
var ipAddress = ipHostInfo.AddressList[0];
var localEndPoint = new IPEndPoint(ipAddress, portNumber);
Console.WriteLine("Starting server with local IP {0}", ipAddress);
var listener = new TcpListener(localEndPoint);
listener.Start(maxConnectionsNumber);
Console.WriteLine();
Console.WriteLine("Server started...");
Console.WriteLine();
while (true)
{
var socket = listener.AcceptSocket();
Task.Factory.StartNew(() =>
{
ProcessSocket(socket);
});
}
}
private static async void ProcessSocket(Socket socket)
{
try
{
using (var stream = new NetworkStream(socket))
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
writer.AutoFlush = true;
var received = await reader.ReadToEndAsync();
Console.WriteLine("Received: " + received);
}
socket.Close();
socket.Dispose();
}
catch (Exception exception)
{
Console.WriteLine("There was an error processing a message.");
Console.WriteLine(exception);
}
}
}
}
看到上面的代码运行ning:
测试申请:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace TcpConsoleClient
{
class Program
{
static void Main(string[] args)
{
var ipHostInfo = Dns.GetHostEntry("localhost");
var ipAddress = ipHostInfo.AddressList[0];
var remoteEndPoint = new IPEndPoint(ipAddress, 3245);
var client = new TcpClient(remoteEndPoint);
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
writer.AutoFlush = true;
string input;
while((input = Console.ReadLine()) != "exit")
{
writer.WriteLine(input);
}
}
}
}
}
一个 TCP/IP 连接有一个本地 IP 地址和端口,以及一个远程 IP 地址和端口。
一般情况下,一个端口号一次只能分配给一个socket。错误消息表明试图将多个套接字与同一端口号相关联。
原因可以在客户端代码中找到:
var client = new TcpClient(remoteEndPoint);
TcpClient
构造函数的重载接受一个 IPEndPoint
指定 local 端点。也就是说,当构造 TcpClient
时,它将绑定到 remoteEndPoint
指定的端口号,这会失败,因为该端口号已被服务器应用程序使用。
要解决此问题,请使用无参数 TcpClient
构造函数,并将 remoteEndPoint
传递给 Connect
调用:
var client = new TcpClient();
client.Connect(remoteEndPoint);
免责声明:这是我第一次涉足与 tcp/socket 直接相关的任何事情。我读过 -the- -following- -resources- 并试图提出一个非常简单的测试应用程序。
我正在尝试开发本地服务器 运行 TcpListener 对象。我可以很好地实例化它并 运行 netstat
以查看处于 LISTENING 状态的端口。但是,我无法通过 telnet 或创建测试客户端来手动连接。 Telnet 只是说它无法打开连接。尝试测试客户端应用程序抛出异常
An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
Additional information: Only one usage of each socket address (protocol/network address/port) is normally permitted
在thisSO问题中,提问者最终通过故障网卡解决了问题。我该如何查找?
这让我很困惑。我如何测试或连接到服务器?这是我的代码。
对于服务器:
using System;
using System.Configuration;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace TcpConsole
{
class Program
{
static void Main(string[] args)
{
var localPort = ConfigurationManager.AppSettings["localPort"];
var portNumber = int.Parse(localPort);
var maxConnections = ConfigurationManager.AppSettings["maxConnections"];
var maxConnectionsNumber = int.Parse(maxConnections);
Console.WriteLine("Preparing to start server on port {0}", portNumber);
Console.WriteLine("Max connections: {0}", maxConnectionsNumber);
var ipHostInfo = Dns.GetHostEntry("localhost");
var ipAddress = ipHostInfo.AddressList[0];
var localEndPoint = new IPEndPoint(ipAddress, portNumber);
Console.WriteLine("Starting server with local IP {0}", ipAddress);
var listener = new TcpListener(localEndPoint);
listener.Start(maxConnectionsNumber);
Console.WriteLine();
Console.WriteLine("Server started...");
Console.WriteLine();
while (true)
{
var socket = listener.AcceptSocket();
Task.Factory.StartNew(() =>
{
ProcessSocket(socket);
});
}
}
private static async void ProcessSocket(Socket socket)
{
try
{
using (var stream = new NetworkStream(socket))
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
writer.AutoFlush = true;
var received = await reader.ReadToEndAsync();
Console.WriteLine("Received: " + received);
}
socket.Close();
socket.Dispose();
}
catch (Exception exception)
{
Console.WriteLine("There was an error processing a message.");
Console.WriteLine(exception);
}
}
}
}
看到上面的代码运行ning:
测试申请:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace TcpConsoleClient
{
class Program
{
static void Main(string[] args)
{
var ipHostInfo = Dns.GetHostEntry("localhost");
var ipAddress = ipHostInfo.AddressList[0];
var remoteEndPoint = new IPEndPoint(ipAddress, 3245);
var client = new TcpClient(remoteEndPoint);
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
writer.AutoFlush = true;
string input;
while((input = Console.ReadLine()) != "exit")
{
writer.WriteLine(input);
}
}
}
}
}
一个 TCP/IP 连接有一个本地 IP 地址和端口,以及一个远程 IP 地址和端口。
一般情况下,一个端口号一次只能分配给一个socket。错误消息表明试图将多个套接字与同一端口号相关联。
原因可以在客户端代码中找到:
var client = new TcpClient(remoteEndPoint);
TcpClient
构造函数的重载接受一个 IPEndPoint
指定 local 端点。也就是说,当构造 TcpClient
时,它将绑定到 remoteEndPoint
指定的端口号,这会失败,因为该端口号已被服务器应用程序使用。
要解决此问题,请使用无参数 TcpClient
构造函数,并将 remoteEndPoint
传递给 Connect
调用:
var client = new TcpClient();
client.Connect(remoteEndPoint);