私はPerlスクリプトを書いてTCPを介してクライアントとサーバーの間に文字列を送ります。接続は行われますが、クライアントからのデータ送信は受信されません。クライアント用サーバーシャットダウンする前に送信されたすべてのソケットデータが受信されるわけではありません。
#!/usr/bin/perl -w
use strict;
use Socket;
my $port = 8021;
my $proto = getprotobyname ('tcp');
my $server = "localhost";
socket (SOCKET, PF_INET, SOCK_STREAM, $proto)
or die "Can't open socket: $!";
bind (SOCKET, pack_sockaddr_in ($port, inet_aton ($server)))
or die "Can't bind $server:$port: $!";
listen (SOCKET, 5)
or die "Can't listen on $server:$port: $!";
my $client_addr;
while ($client_addr = accept (NEW_SOCKET, SOCKET))
{
my $name = gethostbyaddr ($client_addr, AF_INET);
while (<NEW_SOCKET>)
{
print "Recieved from client: $_<<ENDL\n";
}
print NEW_SOCKET "Smile from the server.";
print "Connection recieved from $name\n";
close NEW_SOCKET or warn "Couldn't close socket: $!";
}
全コードの
完全なコード。コメントSEE HERE
を探します。
#!/usr/bin/perl -w
use strict;
use Socket;
my $port = 8021;
my $proto = getprotobyname ('tcp');
my $server = "localhost";
$server = $ARGV[0] if (1 == @ARGV);
socket (SOCKET, PF_INET, SOCK_STREAM, $proto)
or die "Can't create a socket: $!\n";
connect (SOCKET, pack_sockaddr_in ($port, inet_aton ($server)))
or die "Can't connect to $server:$port: $!\n";
# SEE HERE
# my $s = select (SOCKET);
# $| = 1; # make it hot
# select ($s);
print SOCKET "Test message from client to $server:$port.";
shutdown (SOCKET, 1) or warn "Couldn't shutdown socket to $server:$port.";
while (<SOCKET>)
{
print "Server $server:$port responds with: $_<<ENDL\n";
}
close SOCKET or die "Can't close socket to $server:$port: $!";
現状ではもののTest message
は、サーバー出力
Connection recieved from ANantes-256-1-226-50.w2-0.abo.wanadoo.fr
とクライアントの出力
Server localhost:8021 responds with: Smile from the server.<<ENDL
は明らかに、クライアントのshutdown
コマンドが正しく、終了し、サーバーのwhile(<NEW_SOCKET>)
ループを引き起こしクライアントの印刷物はそのループで読み取られません。
しかし、SEE HERE
以下の行のコメントを外すと、サーバーは応答を送信する前にテストメッセージを出力します。
確かにshutdown
の場合、保留中のデータはすべてフラッシュされるはずです。
なぜ$| = 1
行が必要ですか?
また、trust$| = 1
の行は可能ですか?メッセージが切り捨てられないようにshutdown
(またはおそらく)close
を信頼できない場合、どうすれば$|=1
を信頼できますか?
サーバの 'while'には' SERVER'とは何ですか? '警告を使用してください'。 – zdim
それはタイプミスでしたが、私はそれを修正しました、ありがとう、しかし同じ問題がまだあります。 – spraff
さて、サーバーでwhile() 'に変更し、両方のプログラムがハングするようになりました。 –
spraff