新中新二代身份证读卡Syn_ReadBaseMsg方法

新中新二代身份证读卡器dkq-a16d,在C#中读卡开发时,参考随机附带的C#参考代码,能够读取成功,但读几次程序就莫名其妙的关掉了,有时连错误都捕捉不到,搞了很长时间也没搞定,后来以为会不会是win7系统支持不好,就在XP系统中继续鼓捣,问题依旧。
  后来不相信,直接使用其自带的一个读卡程序以及其他语言开发的测试,都会出现这种问题,有时候读不到10次,有时候多几次,也会自动关闭程序。而出现这种情况,全部是通过调用支持动态库中的Syn_ReadMsg函数进行读取的,这说明此函数本身有问题。最后改成调用Syn_ReadBaseMsg函数,就解决了这个莫名其妙的问题。
  Syn_ReadBaseMsg函数与Syn_ReadMsg函数的区别是,后者是直接将读出的信息进行了格式化(以结构体返回)并生成了图片文件,而前者是通过将信息和图片以2个指针返回,需要开发人员自行处理。

  以下是相关函数代码,仅供参考。


        [DllImport("SynIDCardAPI.dll", EntryPoint = "Syn_ReadBaseMsg", CharSet = CharSet.Ansi)]
        public static extern int Syn_ReadBaseMsg(int iPort, IntPtr pucCHMsg, ref uint puiCHMsgLen, IntPtr pucPHMsg, ref uint puiPHMsgLen, int iIfOpen);

        /// <summary>
        /// 读取身份证基本信息
        /// </summary>
        /// <param name="CardMsg"></param>
        /// <param name="errStr"></param>
        /// <returns></returns>
        public static bool ReadCard(out ZbsoftInterface.IDCardData CardMsg,
            out string errStr)
        {
            CardMsg = new ZbsoftInterface.IDCardData();
            errStr = "";
            int nRet;
            byte[] pucIIN = new byte[4];
            byte[] pucSN = new byte[8];

            #region 获取读卡器
            if (nPort == 0)
            {
                if (!FindDrivers(out errStr))
                {
                    if (string.IsNullOrEmpty(errStr))
                        errStr = "没有找到读卡器";
                    return false;
                }
            }
            #endregion

            if (Syn_OpenPort(nPort) == 0)
            {
                if (Syn_SetMaxRFByte(nPort, 80, 0) == 0)
                {
                    nRet = Syn_StartFindIDCard(nPort, ref pucIIN[0], 0);
                    nRet = Syn_SelectIDCard(nPort, ref pucSN[0], 0);
                    string cardMsg = new string(' ', 256);  //身份证基本信息返回长度为256
                    string imgMsg = new string(' ', 1024);  //身份证图片信息返回长度为1024
                    IntPtr msg = Marshal.StringToHGlobalAnsi(cardMsg);  //身份证基本信息
                    IntPtr img = Marshal.StringToHGlobalAnsi(imgMsg);   //身份证图片
                    try
                    {
                        uint mLen = 0;
                        uint iLen = 0;
                        nRet = Syn_ReadBaseMsg(nPort, msg, ref mLen, img, ref iLen, 0);
                        if (nRet == 0)
                        {
                            string card = Marshal.PtrToStringUni(msg);
                            char[] cartb = card.ToCharArray();
                            CardMsg.Name = (new string(cartb, 0, 15)).Trim();
                            CardMsg.Sex = new string(cartb, 15, 1);
                            CardMsg.Nation = new string(cartb, 16, 2);
                            CardMsg.Born = new string(cartb, 18, 8);
                            CardMsg.Address = (new string(cartb, 26, 35)).Trim();
                            CardMsg.IDCardNo = new string(cartb, 61, 18);
                            CardMsg.GrantDept = (new string(cartb, 79, 15)).Trim();
                            CardMsg.UserLifeBegin = new string(cartb, 94, 8);
                            CardMsg.UserLifeEnd = new string(cartb, 102, 8);
                            return true;
                        }
                        else
                        {
                            errStr = "读取身份证信息错误";
                        }
                    }
                    catch (Exception e) { errStr = e.Message; }
                    finally
                    {
                        Marshal.FreeHGlobal(msg);
                        Marshal.FreeHGlobal(img);
                    }
                }
                else
                {
                    errStr = "SetMaxRFByte出错";
                }
            }
            else
            {
                errStr = "打开端口失败";
            }
            return false;
        }


        /// <summary>
        /// 自动查询读卡器
        /// </summary>
        /// <param name="err">错误信息</param>
        /// <returns></returns>
        public static bool FindDrivers(out string err)
        {
            int i = 0;
            err = "";
            try
            {
                i = Syn_FindReader();
            }
            catch (Exception e)
            {
                err = e.ToString();
                return false;
            }
            if (i > 0)
            {
                nPort = i;
            }
            else
            {
                nPort = 0;
                return false;
            }
            return true;
        }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: tcp_max_syn_backlog 是一个 TCP 协议的参数,用于控制 TCP SYN 连接请求的最大队列长度。当有大量的客户端同时向服务器发起连接请求时,服务器可能会出现 SYN 队列溢出的情况,导致客户端连接失败。通过调整 tcp_max_syn_backlog 参数,可以增加 TCP SYN 队列的最大长度,从而提高服务器的连接请求处理能力。 在 Linux 系统中,tcp_max_syn_backlog 默认值为 1024。可以通过修改 /proc/sys/net/ipv4/tcp_max_syn_backlog 文件来调整该参数的值。但需要注意的是,过大的 tcp_max_syn_backlog 值会占用过多的系统资源,从而影响系统的性能表现。 ### 回答2: tcp_max_syn_backlog是TCP协议中一个参数,用于控制SYN队列的最大长度。SYN队列存储了正在与服务器建立连接的客户端请求,当服务器接收到客户端的SYN请求时,会将其放入SYN队列中。tcp_max_syn_backlog参数的作用就是控制SYN队列的最大长度,当SYN队列已满时,服务器将无法接受的连接请求。 如果tcp_max_syn_backlog值设置过小,当服务器接收到大量的客户端连接请求时,有可能会导致SYN队列溢出,从而导致的连接请求被丢弃,客户端无法与服务器建立连接。在高并发的网络环境下,适当增大tcp_max_syn_backlog值可以提高服务器的处理能力,减少客户端连接丢失的概率。 然而,设置过大的tcp_max_syn_backlog值也会有一些问题。首先,SYN队列的长度是有限的,如果设置过大,会占用服务器的内存资源。其次,如果服务器无法及时处理SYN队列中的请求,会造成客户端连接的延迟增加。 因此,在调整tcp_max_syn_backlog值时,需要根据服务器的实际情况进行综合考虑。一般来说,如果服务器处于高并发的环境中,可以适当增大tcp_max_syn_backlog值。而对于低并发的场景,则可以适当减小tcp_max_syn_backlog值,以节省服务器资源。为了保证服务器的稳定性和性能,在调整tcp_max_syn_backlog值时,还需要结合服务器的硬件配置、网络带宽以及预计的连接请求负载等因素进行综合评估和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值