出産前後の痔にはご注意!

IO::Socketを利用してクライアントを作成しようとしているのですが、サーバーが返すパケットの末尾が 0A(\n) ではなく 00(←?) であるため、クライアント側で

while ($receive = <$client_socket>) {
print $receive;
}

を使用し正常に受信・表示する事が出来ないようです。末尾が 00 で終わっているデータを受信・表示するにはどうしたら良いのでしょうか?

A 回答 (2件)

{


local ($/) = "\0"
while ($receive = <$client_socket>) {
print $receive;
}
}
こんな感じかな?
(やったことないので適当だけど)

この回答への補足

お早い回答ありがとうございます。
早速試してみたところ、

{
local($/) = "\0";
$receive = <$client_socket>;
print $receive;
}

この様にすれば1番目の受信パケットは認識・表示する事ができました。
しかし、2番目以降も表示させるためwhileでループを作った場合は認識できなくなってしまいました…。
ループさせない場合は認識出来たので、もう少し頑張ってみようと思います。

補足日時:2004/12/11 01:20
    • good
    • 0
この回答へのお礼

その後、sysreadを利用してバッファに読み込み、
その内容をsplitで切る事で表示させることができました。
ありがとうございました!

お礼日時:2004/12/12 18:17

バッファリングの問題だったりして?


関係なかったらすみません

この回答への補足

パケットを見てみると、

local→DEST 送信(データ要求) ACK
DEST→local size0 ACK
DEST→local size60 ACK (←ループさせなければこれは表示出来ました。)
local→DEST size0 ACK
DEST→local size100 ACK
local→DEST size0 ACK
....

の様になっているのですが・・・
勉強不足です(泣

補足日時:2004/12/11 09:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qソケットでのデータ送受信について教えてください

はじめまして。
Perlでのソケット通信プログラムで質問があります。

現在ソケットで通信を行うテストプログラムを作っているのですが、
クライアントからサーバへの片方向送信は出来るのですが、
クライアントからデータ受信後、サーバからクライアントへ応答を
返す処理が上手くいきません。

私としては、クライアントとサーバの処理を逆にすればよいだけかな
と思っているのですが認識違いでしょうか?

宜しくお願いします。

環境
OS:Linux
言語:Perl5.8

■上手くいく場合(かなり省略します。ポイントだけ)
サーバ側
$client=accept(C_SOCKET, P_SOCKET);
while(<C_SOCKET>){
printf("%s",$_); #受信データ
}

クライアント側
socket (SOCKET, PF_INET, SOCK_STREAM, 0);
connect(SOCKET, pack_sockaddr_in(9000,$ipaddr_bin));
print SOCKET "Test Data!!\n";

→サーバ側端末にTest Data!!と表示

■送受信しようとしてダメなもの
サーバ側
$client=accept(C_SOCKET, P_SOCKET);
while(<C_SOCKET>){
printf("%s",$_); #受信データ
}
print C_SOCKET "Return Data!!\n";


クライアント側
socket (SOCKET, PF_INET, SOCK_STREAM, 0);
connect(SOCKET, pack_sockaddr_in(9000,$ipaddr_bin));
print SOCKET "Test Data!!\n";
while(<SOCKET>){
printf("%s",$_); #応答データ
}

→サーバ側にはTest Data!!すら表示されない。
 もちろんクライアント側にも。

はじめまして。
Perlでのソケット通信プログラムで質問があります。

現在ソケットで通信を行うテストプログラムを作っているのですが、
クライアントからサーバへの片方向送信は出来るのですが、
クライアントからデータ受信後、サーバからクライアントへ応答を
返す処理が上手くいきません。

私としては、クライアントとサーバの処理を逆にすればよいだけかな
と思っているのですが認識違いでしょうか?

宜しくお願いします。

環境
OS:Linux
言語:Perl5.8

■上手くいく場合(かなり省略しま...続きを読む

Aベストアンサー

クライアント側でprintしたのが、
バッファに溜まったまま、でしょうか?

select SOCKET ;
$| = 1;
print SOCKET "Test Data!!\n";

FileHandleモジュールを使うようにすれば

SOCKET->autoflush(1);


人気Q&Aランキング