在 c# 中通常只允许使用每个套接字地址 (protocol/network address/port)
Only one usage of each socket address (protocol/network address/port) is normally permitted in c#
我正在尝试使用网络连接到传感器,传感器的 ip 是端口 3000 上的 192.168.2.44;
try
{
byte[] byteReadStream = null; // holds the data in byte buffer
IPEndPoint ipe = new IPEndPoint(IPAddress.Any,
3000); //listen on all local addresses and 8888 port
TcpListener tcpl = new TcpListener(ipe);
while (true)
{
//infinite loop
tcpl.Start(); // block application until data and connection
TcpClient tcpc = tcpl.AcceptTcpClient();
byteReadStream = new byte[tcpc.Available]; //allocate space
tcpc.GetStream().Read(byteReadStream, 7000, tcpc.Available);
Console.WriteLine(Encoding.Default.GetString(byteReadStream)
+ "\n")
;
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
Console.ReadLine();
}
我收到这个错误:
Only one usage of each socket address (protocol/network address/port) is normally permitted
我是套接字新手
看起来您每次都试图打开端口只是为了阻止应用程序直到数据可用。不要尝试重新打开端口。而是让读取函数做等待
Best way to wait for TcpClient data to become available?
byte[] reap = new byte[2048];
var memStream = new MemoryStream();
IPEndPoint ipe = new IPEndPoint(IPAddress.Any,
3000); //listen on all local addresses and 8888 port
TcpListener tcpl = new TcpListener(ipe);
tcpl.Start(); // block application until data and connection
TcpClient tcpc = tcpl.AcceptTcpClient();
int bytesread = tcpc.GetStream().Read(resp, 0, resp.Length);
while (bytesread > 0)
{
memStream.Write(resp, 0, bytesread);
bytesread = tcpc.GetStream().Read(resp, 0, resp.Length);
}
想法是您与流交互,而不是 TcpClient。然后尝试每次读取一些字节。当然实际阅读可能更少。在我的示例中,我将结果放入内存流中。关键是你不要在每个循环周期都尝试重新连接,因为你已经在上一个循环 运行 中打开了端口。
也可以考虑使用这个 Async,除非你很高兴你的线程在 read 方法上被阻塞。另外通常你必须考虑优雅地关闭端口
虽然这将修复此方法中的代码,但由于这些原因,您可能会遇到错误。我试着帮你揭开它们
此方法被多次调用或被多个线程调用。在方法的开头放一些Console.Writeline("This should happen once")来检测到
端口已经打开!。使用 'netstat -an' 或一些端口监控产品来检测。我建议关闭 visual studio 并检查
你有一些自动测试可以打开你机器上的端口。
我正在尝试使用网络连接到传感器,传感器的 ip 是端口 3000 上的 192.168.2.44;
try
{
byte[] byteReadStream = null; // holds the data in byte buffer
IPEndPoint ipe = new IPEndPoint(IPAddress.Any,
3000); //listen on all local addresses and 8888 port
TcpListener tcpl = new TcpListener(ipe);
while (true)
{
//infinite loop
tcpl.Start(); // block application until data and connection
TcpClient tcpc = tcpl.AcceptTcpClient();
byteReadStream = new byte[tcpc.Available]; //allocate space
tcpc.GetStream().Read(byteReadStream, 7000, tcpc.Available);
Console.WriteLine(Encoding.Default.GetString(byteReadStream)
+ "\n")
;
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
Console.ReadLine();
}
我收到这个错误:
Only one usage of each socket address (protocol/network address/port) is normally permitted
我是套接字新手
看起来您每次都试图打开端口只是为了阻止应用程序直到数据可用。不要尝试重新打开端口。而是让读取函数做等待
Best way to wait for TcpClient data to become available?
byte[] reap = new byte[2048];
var memStream = new MemoryStream();
IPEndPoint ipe = new IPEndPoint(IPAddress.Any,
3000); //listen on all local addresses and 8888 port
TcpListener tcpl = new TcpListener(ipe);
tcpl.Start(); // block application until data and connection
TcpClient tcpc = tcpl.AcceptTcpClient();
int bytesread = tcpc.GetStream().Read(resp, 0, resp.Length);
while (bytesread > 0)
{
memStream.Write(resp, 0, bytesread);
bytesread = tcpc.GetStream().Read(resp, 0, resp.Length);
}
想法是您与流交互,而不是 TcpClient。然后尝试每次读取一些字节。当然实际阅读可能更少。在我的示例中,我将结果放入内存流中。关键是你不要在每个循环周期都尝试重新连接,因为你已经在上一个循环 运行 中打开了端口。
也可以考虑使用这个 Async,除非你很高兴你的线程在 read 方法上被阻塞。另外通常你必须考虑优雅地关闭端口
虽然这将修复此方法中的代码,但由于这些原因,您可能会遇到错误。我试着帮你揭开它们
此方法被多次调用或被多个线程调用。在方法的开头放一些Console.Writeline("This should happen once")来检测到
端口已经打开!。使用 'netstat -an' 或一些端口监控产品来检测。我建议关闭 visual studio 并检查
你有一些自动测试可以打开你机器上的端口。