有人可以解释为什么我的 server/client 不能以他们建立连接的方式工作吗?

Can someone explain why my server/client don't work in a way they establish a connection?

我开始使用套接字并尝试创建一个客户端和服务器,在将消息传送到服务器后,客户端可以通过它连接到服务器,而不会中断联系,反之亦然。

我遇到的问题是他们都没有输出任何东西(我可以看到服务器正在监听并且客户端直接停止自己没有输出任何东西)

两个程序都没有任何词汇错误。

这是客户端代码:

#!/usr/bin/perl -w

use strict;
use diagnostics;

use Socket;

my $port = somedigits;
my $server_addr = "somebits\.somebits\.somebits\.somebits";
 
sub open_TCP
{
  # get parameters
  my ($FS, $server_addr, $port) = @_;
 
  my $proto = getprotobyname('tcp');
  socket($FS, PF_INET, SOCK_STREAM, $proto);
  my $sin = sockaddr_in($port,inet_aton($server_addr));
  connect($FS,$sin) || return undef;
  
  my $old_fh = select($FS); 
  $| = 1;               # don't buffer output
  select($old_fh);
  1;
}
1;

&open_TCP;

这是服务器代码:

#!/usr/bin/perl -w

use strict;
use diagnostics;

use Socket;




my $port = somedigits;
my $server_addr = "somebits\.somebits\.somebits\.somebits";

socket(my $socket, PF_INET, SOCK_STREAM, getprotobyname("tcp")) or die $!; # initalize socket

bind($socket, pack_sockaddr_in($port, inet_aton($server_addr))) # associate socket with port
    or die("can't bind to port:" . $port);

listen($socket, 5) # start listening
    or die ;
    
while(my $incoming_client = accept(my $new_socket, $socket)) { # accept incoming connections
    my $hostname = gethostbyaddr($incoming_client, AF_INET);
    sleep 2;
    print $new_socket "someoutput" . time() . "\n";
    printf("Connection from: $hostname");
    close $new_socket;
};
  • 在客户端中,sub 的 $server_addr 未初始化,因为您没有向 sub 传递任何参数。

  • 在客户端中,sub 的 $port 未初始化,因为您没有向 sub 传递任何参数。

  • 修复上面的问题,它就可以工作了。但是,您可能认为它不起作用,因为您没有刷新输出。当 STDOUT 连接到终端时,使用 printf("Connection from: $hostname\n"); 就足够了。

  • 最后,

    my $hostname = gethostbyaddr($incoming_client, AF_INET);
    

    应该是

    my ($port, $packed_addr) = unpack_sockaddr_in($incoming_client);
    my $hostname = gethostbyaddr($packed_addr, AF_INET);
    
  • 顺便说一句,if(!$incoming_client) 检查是无用的,因为如果 $incoming_client 为假,您就不会到达该语句。

以下示例演示了简单的网络 serverclient.

server.pl

样本
use strict;
use warnings;
use feature 'say';

use Socket;

my $server  = 'localhost';
my $port    = shift || 6000;
my $proto   = getprotobyname('tcp');

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 to port $port!";

listen(SOCKET, 5) or die "listen: $!";
say "SERVER: listen on $port";

while( my $client_addr = accept(NEW_SOCKET, SOCKET)) {
    my($port, $iaddr) = sockaddr_in($client_addr);
    my $name = gethostbyaddr($iaddr, AF_INET);
    my $ip   = inet_ntoa($iaddr);
    say "CLIENT: connection from $name $ip at port $port";
    print NEW_SOCKET "SERVER: localtime is " . localtime();
    close NEW_SOCKET;
}

client.pl

样本
use strict;
use warnings;
use feature 'say';

use Socket;

my $server  = shift || 'localhost';
my $port    = shift || 6000;
my $proto   = getprotobyname('tcp');

socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
    or die "Can't create a socket $!";
    
connect(SOCKET, pack_sockaddr_in($port, inet_aton($server)))
    or die "Can't connect to port $port!";
    
while( <SOCKET> ) {
    say;
}

close SOCKET or die "CLOSE: $!";

建议:快速访问以下页面将有助于您进行编程