0

EDIT1:win7x86で試してみましたが、うまくいきました。それは間違いなく x64 の問題のようです... Windows x64 マシンで TCP ソケット「x86」スタイルを送信するにはどうすればよいですか?

EDIT2:@RemyLebeauが親切に尋ねたので、スクリーンショットの代わりに* .pcapファイルを添付しました。

このテキスト文字列をプリンターに送信する必要があります。コードを理解するために改行/CRLFなどは必要ありません。つまり、すべての単語が反対側に到着した後、印刷されます。

プリンターは RS232 ですが、Advantech ADAM4577 Ethernet-RS232 ゲートウェイを使用して信号を変換しています。私がすべきことは、ゲートウェイへの TCP 接続を開き、次のような文字列を吐き出すことだけです。

  ^XA~TA000~JSN^LT0^MMT^MNW^MTT^PON^PMN^LH0,0^JMA^PR3,3^MD10^JUS^LRN^CI0^XZ
  ^XA^LL0168
  ^PW272
  ^FT61,34^A0N,28,28^FH\^FD2053200863^FS
  ^BY2,3,91^FT47,138^BCN,,Y,N
  ^FD>;9678130580^FS
  ^PQ1,0,1,Y^XZ

私は Delphi を使用しているので、TClientSocket を試しました。

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Win.ScktComp, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    ClientSocket1: TClientSocket;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  if not ClientSocket1.Active then
  begin
    ClientSocket1.Port := 9100;
    ClientSocket1.Host := '10.6.2.140';
    ClientSocket1.Address := '10.6.2.140';
    ClientSocket1.ClientType := ctNonBlocking;
    ClientSocket1.Open;
  end;

end;

procedure TForm2.Button2Click(Sender: TObject);
var
  zcode : string;
begin
 zcode :=  '^XA~TA000~JSN^LT0^MMT^MNW^MTT^PON^PMN^LH0,0^JMA^PR3,3^MD10^JUS^LRN^CI0^XZ' +
            '^XA^LL0168' +
            '^PW272' +
            '^FT61,34^A0N,28,28^FH\^FD2053200863^FS' +
            '^BY2,3,91^FT47,138^BCN,,Y,N' +
            '^FD>;9678130580^FS' +
            '^PQ1,0,1,Y^XZ';

  ClientSocket1.Socket.SendText(zcode);
end;

procedure TForm2.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
      ShowMessage(IntToStr(ErrorCode));
      ErrorCode := 0;
end;

end.

しばらくすると、次のようになります。

Socket Error 10053 (WSAECONNABORTED)

x64 マシンでフィルタリングされた pcap ファイルは次のとおりです: リンク

まったく同じプログラム、x86: リンク

TIdClientSocket と同じテキスト: (UsaNagle はデフォルトで true に設定され、IpVersion は IPv4 です。

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    IdTCPClient1: TIdTCPClient;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  if not IdTCPClient1.Connected then
  begin
    IdTCPClient1.Host := '10.6.2.140';
    IdTCPClient1.Port := 9100;
    idTCPClient1.Connect;
  end;


end;

procedure TForm2.Button2Click(Sender: TObject);
var
  zcode : string;
begin
 zcode :=  '^XA~TA000~JSN^LT0^MMT^MNW^MTT^PON^PMN^LH0,0^JMA^PR3,3^MD10^JUS^LRN^CI0^XZ' +
            '^XA^LL0168' +
            '^PW272' +
            '^FT61,34^A0N,28,28^FH\^FD2053200863^FS' +
            '^BY2,3,91^FT47,138^BCN,,Y,N' +
            '^FD>;9678130580^FS' +
            '^PQ1,0,1,Y^XZ';

  IdTCPClient1.IOHandler.WriteLn(zcode);
end;

end.

pcap ファイル、x64: リンク

まったく同じプログラム、x86: リンク

4

1 に答える 1

1

.pcap ファイルによると:

WinXPx86 システムは次のことを行っています。

センド:

^

これは ACK され、次に送信します。

XA~TA000~JSN^LT0^MMT^MNW^MTT^PON^PMN^LH0,0^JM

これはACKされ、送信されます:

A^PR3,3^MD10^JUS^LRN^CI0^XZ^XA^LL0168^PW272^FT61,34^A0N,28,28^FH\^FD2053200863^FS^BY2,3,91^FT47,138^BCN,,Y,N^FD>;9678130580^FS^PQ1,0,1,Y^XZ

これはACKされ、切断されます。

一方、Win7x64 システムは次のことを行っています。

センド:

^

これはACKされ、送信されます:

XA~TA000~JSN^LT0^MMT^MNW^MTT^PON^PMN^LH0,0^JMA^PR3,3^MD10^JUS^LRN^CI0^XZ^XA^LL

しかし、ACK される前に切断されます。

その^LL部分まで、彼らは正確なデータ データを送信しています。ただし、この活動は次のことを示唆しています。

  1. x86 と x64 のコードは、同じ TCP データを異なるフレーミングで送信しているため、同じコード ロジックを使用している場合と使用していない場合があります (ただし、ソケットによって内部的に使用される Nagle アルゴリズムに関連している可能性があります)。

  2. TClientSocketWin7x64 では、ソケットが途中で切断されています。これは、コードで発生したエラーに反応してソケットを閉じるのが早すぎる場合など、コーディングの問題である可能性があります。

実際のコードを確認しないと、この問題をさらにトラブルシューティングする方法はありません。それ以外の場合は、コードにログを追加して、各ステップで実際に何を行っているか (ソケットを閉じるタイミングと理由など) を確認する必要があります。

于 2013-09-13T19:51:17.220 に答える