ソケット通信でのテキスト送信における問題と解決方法

このQ&Aのポイント
  • ソケット通信でテキスト送信する際に、特定の条件が発生し動作しない問題が発生しています。具体的には、ボタンごとに送信するテキストが2桁の数字になると正しく送信されないという問題です。この問題の解決方法として、バイトオーダーの変換が関係している可能性があります。バイトオーダーの変換についての具体的なやり方を理解することが重要です。
  • 現在、ソケット通信によるテキスト送信を行っていますが、特定の条件下で正しく動作しない問題が発生しています。具体的には、テキストの中に2桁の数字が含まれる場合に送信がうまくいかないという問題です。この問題にはバイトオーダーの変換が関係している可能性があります。バイトオーダーの変換の方法を正しく理解することが解決の鍵です。
  • ソケット通信を使用してテキストを送信する際に、特定の条件が原因で正しく動作しない問題が発生しています。具体的には、2桁の数字が含まれるテキストを送信する場合に問題が発生します。この問題にはバイトオーダーの変換が関係している可能性があります。バイトオーダーの変換方法を正しく理解することで問題を解決することができます。
回答を見る
  • ベストアンサー

ソケット通信

たびたびお世話になります。 CreateProcessで「cmd /C ***.bat」、 ***.batの中では vbsを動かして、telnet xxx.xxx.xxx.xxx を起動しています。 ウィンドウを表示させないように言われていますが、どうしてもtelnetが動くと、 ウィンドウが表示されてしまいます。 batのなかで、cscriptで*.vbsを読んでるからと思います。 (cscriptは画面を消せない???) なので、ソケット通信に変更してみました。 まったくウィンドウが出ないので「良し良し!」だったのですが 動かない箇所が出てきました。 例えば、ボタンが複数あって ボタンごとに「set 0」「set 1」...「set 77」 などとsend()するのですが、「set 10」以降、set の次の数字が2桁になると動かなくなってしまいました。 特にclient側ではエラーにはならなくて、サーバー側・受けとったほうで解釈できないものと思います。 サーバー側での解析はできません(ROMに焼き付けてある箱(!)なので) これって、そのままsend()してはダメでしょうか? バイトオーダーの変換???とか関係ありますか? 関係あったとしても、バイトオーダーの変換のやり方がわかりません。(;_;) (いろいろ試したけれどわかりませんでした) telnetで送るデータ、そのままなんですが、当然telnetでは ちゃんと動いています。 すみません、どんなことでも良いのでアドバイスお願いいたします。

  • jg1wjz
  • お礼率91% (148/162)

質問者が選んだベストアンサー

  • ベストアンサー
  • kawais070
  • ベストアンサー率52% (2242/4282)
回答No.1

送信処理と別のスレッドで受信処理はしていますか? 普通のtelnetサーバーは、送られてきたコマンドのエコーバックが実装されているはずなので、それを受信してあげないと、サーバー側の送信バッファが一杯になって処理が止まるとかいうことも考えられなくはないかなと思いました。

jg1wjz
質問者

お礼

kawais070 さん、ありがとうございます。 受信処理は入れてあります。 ソケット通信処理は実は初めてで、見よう見まねで作りました。なので不安Max! で今、送信bufferに ¥r¥n(大文字にしてあります)が入っていないことに気付き、入れてみたところ不安定ながら(!)動きました。 もうちょっと試験してみます。 これって大事ですよね? これが原因って考えてもいいでしょうか?

関連するQ&A

  • 自動でtelnet

    お世話になります。 ボタンクリックすると自動でTelnetを起動しコマンドを投げてtelnetを終了する...処理を作っています。 telnet接続からの操作はvbsで作成、 そのvbsをbatfileで起動するようにしました。 古いパソコン環境で動かす(32bit)というので、あえてvc++6.0で作成し正常に、動きました。 それを64bitのWindows2012で動かしたら、vbsの中のtelnetの接続のところでエラーになります。  'telnet'は、内部コマンドまたは外部コマンド、  操作可能なプログラムまたはバッチファイルとして認識されていません と、なります。 telnet clientはinstallしてあり、 コマンドプロンプトでbatファイルをたたくとちゃんと正常に動きます。 batファイルをダブルクリックでも動きます。 コマンドプロンプトでcscript xxx.vbs  としても正しく動きます。 プログラムから CreateProcessで、「cmd xxx.bat」としているのですが。。。 どこが間違ってるのか、何がダメなのか判断が付かないのです。 至急アドバイスをいただけないでしょうか。 よろしくお願いいたします。

  • ソケット通信時のエンディアン変換について

    現在、WindowsとLinux(Unix)でソケット通信を行い、データをやり取りするプログラムを作成しています。 ソースコードやコンパイルの環境は、 Windows側(Windows7):C言語(Windowsプログラミング)、VisualStudio2013でビルド&実行 Linux側:C++、g++(Cygwinを使用) 送信したいデータは、 Windows→Linuxはfloat型の配列に保持しているデータ Linux→Windowsはconst string型のデータ です。 (1)例として、送りたいfloatのデータが float a[3]; a[0] = 1.1; a[1]=2.2; a[2]=3.3 であるとします。(実際には負の値も考えられます) floatは4バイトなので、各要素でエンディアンを変えてa[0]からa[3]のデータを一括してLinux側にsendしたいと考えているのですが、どのように実装すればよいかが分かりません。 for(int i=0; i<3; i++){ //htonl(*(long*)&a[i]);でエンディアンを変換 //変換したものを何かしらの変数に保存 } //保存しておいたものをsend という大まかな流れだけは考えているのですが、実際どう実装していけばいいのか分からず困っています。 (2)(1)のデータを受信した側で元のfloatのデータに直す方法 (3)Linux→Windowsではstring型のデータを送りたいのですが、c_strを用いてchar型に変換したものをそのままsendしてよいのでしょうか? (char型は1バイトなのでエンディアンを変換する操作は必要はないでしょうか?) もし分かることがありましたら、教えていただけると助かります。 よろしくお願いします。

  • バッチファイルからCscriptでVBSが起動できません

    環境は以下の通りです。 サーバA(Windows2000Server)  A.BAT:rshでサーバBのB.batを起動する サーバB(WindowsServer2008STD)  B.bat:バッチ内でCScriptを使用しB.vbsを起動する  ※rshのためSUAをインストール済みです サーバAのA.batを起動するとサーバBのB.batが起動され、内部でB.vbsが動く仕組みです。 しかし、B.Batは起動されるものの、CScriptが無視されているような動作結果になっています。 なお、サーバBで直接B.batを起動すると、B.vbsも起動されます。 リモート起動による影響なのかも知れませんが、現在手詰まり状態で困っています。どなたか解決へのアドバイスを下さいますようお願い致します。 サーバBがWindows2000Sarverの時は問題なく動いていたのですが、WindowsServer2008STDに更新後に動かない事象が発生しました。切替後、しばらくは動いていたのですが、ある時点から動かなくなり、今も動かない状態です。

  • Windows7でのtelnet接続について

    Windows7パソコンでのtelnet接続について教えてください。 異なるセグメント間ではtelnetはできないのでしょうか。 10.4.xxx.xxx から 10.6.xxx.xxx に接続しようとしています。 telnetを実行したのですが、下記メッセージが表示されてしまいました。 「ポート番号 23:接続に失敗しました。」 パソコン側では下記の設定をしています。 Windows の機能の有効化または無効化で「Telnetクライアント」と「Telnetサーバー」をチェック Windowsファイアウォールによるプログラムの許可で「Telnet」をチェック サービス一覧で「Telnet」を開始 以上よろしくお願いします。

  • 改行コードについて vbNewLine

    windows2000,xpで以下のコマンドをリダイレクトして、 result.txtをバイナリエディタで開くと、コードが異なるのですが何故なのでしょうか? windows2000で行うと、0d0d0aとなり、xpで行うと、0d0aとなります。 いったいどうしてなのでしょうか?? sample.bat cscript //nologo sample.vbs >result.txt sample.vbs WScript.Echo vbNewLine

  • TeraTermマクロでの出力キャッチ

    現在TeraTermを使用し、telnetでの自動ログイン及びスクリプトの実行を行っています。 スクリプトの実行(cscriptで実行)までは完成したのですが、そのスクリプトは実行結果として "○"又は"×"の文字列を返してきます。 その出力をマクロ側でキャッチし処理を変える…というような事は可能なのでしょうか? 接続元及び接続先共にWindows2000、2003server、XPのいずれかで、起動スクリプトはVBSです。 宜しくお願いします。

  • PHPでxlsxファイルを印刷したい

    PHP(5.3.1)を使ってサーバー上のエクセルファイル sample.xlsxを印刷しようと思いましたが思うようにいきません。 PHPでサーバー上のbatファイルを呼び出し、そのbatからvbsでバックグラウンド印刷させようとしています。 社内ネットワークでのアプリでして、プリンタは条件によって部署ごとのプリンタが指定されるので変数になっています。 PHP: $ret = exec("cmd.exe /c C:\\xampp\htdocs\excelprint.bat $printerName"); bat: cscript C:\xampp\htdocs\xlsprint.vbs C:\xampp\htdocs\sample.xlsx %1 vbs: Set xl=CreateObject("Excel.Application") xl.AutomationSecurity=2 xl.Visible = false Set bk=xl.WorkBooks.Open(WScript.Arguments.Item(0)) Call bk.PrintOut(,,,,WScript.Arguments.Item(1)) bk.Close Set bk=Nothing xl.Quit Set xl=Nothing 以上のような感じでやってみたのですが印刷されませんでした。 $printerNameがAdobePDFやMSのドキュメントライターのような仮想プリンタの場合は サーバー側で印刷ダイアログ(保存しますか?というやつです)が表示されていますが、 通常の紙に印刷されるプリンタは反応しませんでした。 batファイルの%1をプリンタ名に変えて、batファイルをダブルクリックした場合は印刷されました。 何がまずいのか判る方がいらっしゃれば、教えてください。 よろしくお願いします。

    • 締切済み
    • PHP
  • ソケットプログラミング(配列について)

    こんにちは。 この掲示板に、大変お世話になっています。 私は送信側から受信側へWindows上でUDPソケットを利用し、約3MByteのmpegデータを、1024Byteずつパケットに分割し送信しています。以下に、送信側のプログラムの概要を示します。 [送信側] ・配列[1025]確保し、fread関数を用いてファイルの読み込みを行い、sendto関数で受信側へ送信。 ・1024Byteずつ送出できているかを表示。 ・送出した1024Byteのパケット数を表示。 int n; int Num_n = 0; char send_buf[1025]; while((n = fread(send_buf,1,DATA_SIZE,fp)) != 0){ Num_n++; //1024Byteずつ送出できているかを表示させています printf("n:%dバイト\t",n); sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } //送出したパケット数を表示させています printf("%d個のパケットを送出しました\n",Num_n); <質問内容> 約3MByteのmpegを1024Byteずつ送信した場合、最後のパケットは、「n:4バイト」と表示されました。残りの1020バイト分は、どのような形で送信されているのでしょうか?確保した配列内に何も入っていない形で送信されているのでしょうか? また、私は送信側と受信側でスループットの計算を以下の式から算出しています。 送信側 (送信したパケット数×1024×8)/送信に要した時間 受信側 (受信したパケット数×1024×8)/受信に要した時間 送信したパケット数は3041個。 送信に要した時間=受信に要した時間です。 この場合、送信側での計算として・・・ (3041×1024×8)/送信に要した時間とするのか (3040×1024×8)+4/送信に要した時間とするのか どちらが正当なのでしょうか? よろしくお願いします。

  • PHPでサーバーにインストールされたアプリケーションを起動させたい

    バッチファイルを使って、サーバーにインストールを起動させようとしています。 が、PHPのexec関数が動きません。 バッチファイルを開こうとすると固まってしまいます。 xxx.bat ---------------------- cd C:\Program Files\xxx setup.exe ---------------------- xxx.php ------------------------------ $cmd = "cmd.exe /c start xxx.bat"; exec( $cmd ); ------------------------------ Windowsサーバー2003 R2 Apache2.2 お手数ですが、どなたかご教示下さい。

    • ベストアンサー
    • PHP
  • VBSの修正点を教えてください。

    会社で自動でメールが送れるJOBを作成したいのですが、今のままでは正常に作動できないので。 修正点のご教授をお願いいたします。 下記がWebを参考して作成したバッチファイルです。 Mail.vbs: Set oMsg = CreateObject("CDO.Message") oMsg.From = "mailsender@gmail.com" oMsg.To = "user@gmail.com" oMsg.Subject = "Test" oMsg.TextBody = "テストメッセージです" & vbCrLf & Now oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") =  2 oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "xxxxxxxxxx" oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 oMsg.Configuration.Fields.Update oMsg.Send Mail.bat: cscript Mail.vbs Webで探して上記の内容で作成しました。 今の状況として、 JOBを動かすサーバーA IP:10.111.222 Aではメールを送信する機能がありません。 ※IPは適当です メール送信ができるサーバーB IP:10.333.444 AサーバーでJOBを起動してBサーバーのメール機能を使ってメールを送りたいと考えています。 Aサーバーからtelnet を利用してBへの25番ポートの穴が開いているのは確認済みです。 Bサーバーのsmtpサーバー名はわかりません。確認しようとしたら、 「IPだけでできるはず」と言われたました。 上記のVBS だと7行目で"xxxxxxxxxx"の部分にBサーバーで使用しているsmtpサーバー名が必要だという認識のため、上記のVBSは使えなのでしょうか? IPだけわかる今の状況でメール送信できるようにする場合どのように修正したらよろしいですか。 また上記VBSは利用できない場合どのように修正したらよろしいでしょうか。 他に必要な情報がございましたらご指摘をお願いいたします。

専門家に質問してみよう