我正在嘗試創建一個處理多個客戶端連接(至少 10 個)的小服務器。在使用 fork 完美運行的當前代碼下方。至少它接受來自客戶端的多個連接。
使用下面的代碼,我有以下行為:
- 客戶請求連接 ==> 接受 ==> 確定
- 客戶端發送資料包 ==> 接收并列印 ==> OK
- 客戶端發送了另一個資料包 ==> 未收到 ==> NOK
最有可能的是,while cicle 只會為每個連接請求激活,這就是我無法檢索其他資料包的原因。
有人可以幫我調整下面的代碼嗎?我需要的是建立一個(或多個)客戶端連接,然后客戶端連續發送資料(不斷開連接),服務器應該回復它收到的每個資料包。
#!/usr/bin/perl -w
use IO::Socket::INET;
$SIG{CHLD} = sub {wait ()};
my $socket = new IO::Socket::INET (
LocalHost => '0.0.0.0',
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1);
die "cannot create socket $!n" unless $socket;
while ($new_sock = $socket->accept()) {
$pid = fork();
die "Cannot fork: $!" unless defined($pid);
if ($pid == 0) { # This is the fork child
$new_sock->recv(my $data, 500);
print "$data\n";
}
}
uj5u.com熱心網友回復:
您需要回圈recv呼叫以從客戶端讀取多個包。此外,正如目前所寫的那樣,SIGCHLD信號中斷accept,因此當第一個子行程死亡時,您的服務器程式終止。您可以在回圈周圍添加一個回圈accept以重新啟動accept呼叫。
例子:
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket::INET;
$SIG{CHLD} = sub { wait; };
my $socket = new IO::Socket::INET (
LocalHost => '0.0.0.0',
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1);
die "cannot create socket $!n" unless $socket;
sub child {
my $sock = shift;
my $data;
print "$$ connected\n";
# loop for as long as there's something coming in
while($sock->recv($data, 500) || $data) {
print "$$ $data"; # prepend the data with the process id
}
print "$$ disconnected\n";
exit 0;
}
while(1) {
while (my $new_sock = $socket->accept()) {
my $pid = fork();
die "Cannot fork: $!" unless defined($pid);
if ($pid == 0) { # This is the fork child
child($new_sock);
}
}
print "accept interrupted - restarting\n";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506229.html
標籤:perl
