c# - android设备上的套接字连接拒绝错误

标签 c# .net xamarin

我有一个与条形码扫描仪配对的安卓设备。该设备设置为每次扫描仪读取条形码时都会使用广播 Intent,我的应用程序会捕获数据,向其中添加一些信息,打开一个连接到服务器的套接字并发送数据。

[BroadcastReceiver(Enabled = true)]
public class FingerScannerReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        using (TcpClient client = new TcpClient(ip, port))
        {
            NetworkStream stream = client.GetStream();
            var b = Encoding.ASCII.GetBytes(decodedData);
            stream.Write(b, 0, b.Length);
        }
    }
}
该应用程序还有一个在端口 3333 上运行的 TCP 监听器。
服务器检索数据并打开到端口 3333 的套接字并将信息发回。
服务器的 TcpListener 代码:
        while (_isServerWorking)
        {
            using (var client = await _server.AcceptTcpClientAsync())
            {
                string data = "";
                NetworkStream stream = client.GetStream();

                byte[] bytes = new byte[32267];

                int n;
                while ((n = stream.Read(bytes, 0, bytes.Length)) > 0)
                    data += Encoding.ASCII.GetString(bytes, 0, n);
                OnServerConnected(args);
            }
        }
这通常工作正常,但每天一两次设备无法再连接,返回连接被拒绝的套接字错误。
服务器端netstat说有不少socket处于CLOSE_WAIT状态

TCP 172.17.0.85:58627 192.168.30.28:41682 CLOSE_WAIT
TCP 172.17.0.85:58627 192.168.30.28:41684 CLOSE_WAIT
TCP 172.17.0.85:58627 192.168.30.28:41686 CLOSE_WAIT


总共有 187 个错误,我认为因此返回拒绝的连接。我会说客户端和服务器套接字都正确关闭,但一定有问题。
这里出了什么问题? Intent 中的套接字连接是否应该在 android 上以不同方式处理?
我应该以不同的方式关闭套接字还是设置一些选项?

最佳答案

在客户端,您处理/关闭套接字:

using (TcpClient client = new TcpClient(ip, port))
在服务器端,客户端套接字也是如此:
using (var client = await _server.AcceptTcpClientAsync())
这里有一个竞争条件。当两者试图在完全相同的时间关闭另一端时,套接字将永远卡在 CLOSE_WAIT 中。
将服务器更改为:
var client = await _server.AcceptTcpClientAsync();
没有使用

关于c# - android设备上的套接字连接拒绝错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65121430/

相关文章:

c# - .NET Compact Framework - 没有 ShowDialog 的模态表单

c# - 一个好的 C# 文件路径生成器库?

Xamarin Forms 应用架构

c# - 从汇编中获取 MSIL?

c# - 如何在 Unity 中编辑网格/顶点

c# - 如何根据 C# 中的条件组合两个具有不同属性的列表

audio - Xamarin可以流式传输.wav音频吗?

ios - 由于 iCloud 组件,无法将开发应用程序分发到 Testflight

c# - 在列表框中选择一个项目后将光标设置在文本框上

c# - Newtonsoft JSON.NET 与 Json Web 服务的兼容性