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: リンク