无法打开端口

时间:2013-02-06 06:47:15

标签: java dll jna

  

我在运行时调用库本机函数OpenSSPComPortUSB()   程序弹出窗口无法打开端口\。\ COM208。为什么会回来   \。\ COM208因为我已经传递PortNumber = 7;下面是Java代码和我的   目标是打开端口COM7以启动与智能的串行通信   料斗中。

    //  AccessITLLib.java


   public class AccessITLLib
    {


       public static class SSP_COMMAND extends Structure
       {
           SSP_FULL_KEY Key;
            public NativeLong BaudRate;
            public byte PortNumber;
                    public NativeLong Timeout;
                    public byte SSPAddress;
                    public byte RetryLevel;
                    public byte EncryptionStatus;
                    public byte CommandDataLength;
                    public byte[] CommandData = new byte[255];
                    public byte ResponseStatus;
                    public byte ResponseDataLength;
                    public byte[] ResponseData = new byte[255];
                    public byte IgnoreError;


       }



       public interface ITLLib extends Library
       {
           ITLLib INSTANCE = (ITLLib) Native.loadLibrary("ITLSSPproc",
                   ITLLib.class);

           public int OpenSSPComPort(SSP_COMMAND p);
           public int OpenSSPComPortUSB(SSP_COMMAND p);
           public int CloseSSPComPort();
           public int CloseSSPComPortUSB();
       }

       public static void main(String[] args)
       {
          SSP_COMMAND commandStruct = new SSP_COMMAND();
          commandStruct.BaudRate = new NativeLong(9600);
          commandStruct.PortNumber =7;
          commandStruct.Timeout = 500;
          commandStruct.RetryLevel = 3;
          commandStruct.IgnoreError = 1;
          commandStruct.SSPAddress =16;



          ITLLib.INSTANCE.CloseSSPComPort();
          ITLLib.INSTANCE.CloseSSPComPortUSB();
          ITLLib.INSTANCE.OpenSSPComPort(commandStruct);
          ITLLib.INSTANCE.OpenSSPComPortUSB(commandStruct);



       }
    }


 here are the c structures
    typedef struct{
        SSP_FULL_KEY Key;
        unsigned long BaudRate;
        unsigned long Timeout;
        unsigned char PortNumber;
        unsigned char SSPAddress;
        unsigned char RetryLevel;
        unsigned char EncryptionStatus;
        unsigned char CommandDataLength;
        unsigned char CommandData[255];
        unsigned char ResponseStatus;
        unsigned char ResponseDataLength;
        unsigned char ResponseData[255];
        unsigned char IgnoreError;
    }SSP_COMMAND;



    typedef struct{
        unsigned long long FixedKey;
        unsigned long long EncryptKey;
    }SSP_FULL_KEY;

2 个答案:

答案 0 :(得分:1)

这可能不是答案;但仍然给你一些建议。

当您尝试通过客户端连接到PORT时;该端口应首先由服务器程序连接,并应该监听客户端。

因此,请使用以下命令检查该端口是否已启动。

  

netstat -lpn | grep 8080

     

netstat -f是windows的命令

你会得到像这样的输出

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 13098 / java

这里我的进程ID是13098,它是使用端口8080的进程

端口可能已启动但防火墙阻止客户端连接,因此您可以停止iptable服务以停止防火墙。

  

service iptables stop

如果客户端仍然无法使用该端口,则该端口在网络级别被阻止(例如路由器)

如何知道端口是否被阻止?

使用客户端计算机上的telnet命令知道端口是否正在侦听。

  

telnet ip port(windows cmd)

我们可以发现一个特定的进程正在使用所有端口 root root 14223 14206 processName

  

lsof -p 14223(进程PID)

输出:
processName 14223 root 5u IPv4 349373 0t0 UDP hostName.com:7575

IPv4表示正在使用端口,端口号为7575

使端口免受服务器进程的影响;使用以下命令终止进程:

  

sudo kill 13098

现在端口8080是免费的。

答案 1 :(得分:1)

您的JNA结构定义与本机定义的布局不匹配。

JNA中的字段顺序必须与本机定义的字段顺序完全匹配(最新版本的JNA实际上要求您实现一个显式声明字段顺序的方法)。

您无意中交换了PortNumberTimeout字段。