• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ソケットでのデータ送受信について教えてください)

ソケット通信でのデータ送受信についての疑問

このQ&Aのポイント
  • ソケット通信でのデータ送受信について教えてください。Perlでのソケット通信プログラムで、クライアントからサーバへの片方向送信はできますが、クライアントからデータ受信後、サーバからクライアントへの応答がうまくいきません。
  • クライアントとサーバの処理を逆にするだけで解決するのでしょうか?
  • どうすれば問題を解決できるでしょうか?

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

  • ベストアンサー
noname#43437
noname#43437
回答No.1

クライアント側でprintしたのが、 バッファに溜まったまま、でしょうか? select SOCKET ; $| = 1; print SOCKET "Test Data!!\n"; FileHandleモジュールを使うようにすれば SOCKET->autoflush(1);

noah3709
質問者

お礼

少々遅れましたが、ありがとうございました。 バッファリングに関する処理漏れだと気づくことが出来ました。

noah3709
質問者

補足

回答ありがとうございます。 YAMAMAYAさんの仰る通りで、select SOCKET;$| = 1; を入れておらずバッファに溜まったままであったらしいです。 挿入したところ動くようになりました。 但し、 ■サーバ側 select SOCKET;$| = 1;select(STDOUT); $client=accept(C_SOCKET, P_SOCKET); while(<C_SOCKET>){  printf("%s",$_); #受信データ  print C_SOCKET "Return Data!!\n"; #送信データ } →動く○ --------------------------------------- select SOCKET;$| = 1;select(STDOUT); $client=accept(C_SOCKET, P_SOCKET); while(<C_SOCKET>){  printf("%s",$_); #受信データ } print C_SOCKET "Return Data!!\n"; #送信データ →While文の外に出すと動かない× これについて何か分かりますか? 宜しくお願いします。

その他の回答 (2)

noname#43437
noname#43437
回答No.3

連続の質疑って良いのでしたっけ、とおもいながら・・・ いくつか方法はありますね。 特殊な1行を受け取ったら(たとえば空行や特別な文字列など) そこでおしまいと判断する方法。 HTTPやSMTPなど、多くのプロトコルがこの方法を採用しています。 最初に文字数を送って、それから改行入り文字列を送り、 受け取り側は最初に受け取った文字数を元に、readで受け取る方法。 バイナリでも何でも送れるのが便利。 但し、TCPパケットの分割を意識する必要が出てくるので、 受け取りたい長さよりreadした長さが短かったら、続きを受け取るなど、 一手間必要になります。

noah3709
質問者

お礼

回答ありがとうございます。 どうやら私が実現する為にはさらなる知識が 必要なようです。 でも必要最低限の処理が出来たので助かりました。

noname#43437
noname#43437
回答No.2

そりゃあ・・・・ while(<C_SOCKET>){ printf("%s",$_); #受信データ } print C_SOCKET "Return Data!!\n"; このwhileを抜けるのは、ソケットが閉じたときです。 なので、printできません。

noah3709
質問者

補足

回答ありがとうございます。 例えば、クライアント側から改行コード付文字列(例:aaaaa\nbbbbb\nccccc\n) が送られてきた場合に全文字列受信後に応答を1回のみ返したいのですが、 while文の中に応答処理を入れると、当然ながら改行で区切られた文字列毎に 応答が返ってしまいます。 私の行いたいことは難しいのでしょうか?

関連するQ&A