Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl套接字编程中,如何从客户端发送数据并从服务器接收数据_Perl_Sockets - Fatal编程技术网

在perl套接字编程中,如何从客户端发送数据并从服务器接收数据

在perl套接字编程中,如何从客户端发送数据并从服务器接收数据,perl,sockets,Perl,Sockets,我正在使用Socket模块在Perl中执行Socket编程,现在我想从客户端发送一个数据并从服务器端接收它。我将如何做到这一点。请帮忙 下面给出了我使用的代码 服务器 #!/usr/bin/perl -w # Filename : server.pl use strict; use IO::Socket; use Socket; use Sys::Hostname; use constant BUFSIZE => 1024; # use port 7890 as default my

我正在使用Socket模块在Perl中执行Socket编程,现在我想从客户端发送一个数据并从服务器端接收它。我将如何做到这一点。请帮忙

下面给出了我使用的代码

服务器

#!/usr/bin/perl -w
# Filename : server.pl

use strict;
use IO::Socket;
use Socket;
use Sys::Hostname;
use constant BUFSIZE => 1024;

# use port 7890 as default
my $port = shift || 7890;
my $proto = getprotobyname('tcp');
my $server = "localhost";  # Host IP running the server

# create a socket, make it reusable
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
   or die "Can't open socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1)
   or die "Can't set socket option to SO_REUSEADDR $!\n";

# bind to a port, then listen
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
   or die "Can't bind to port $port! \n";

listen(SOCKET, 5) or die "listen: $!";
print "SERVER started on port $port\n";

# accepting a connection
my $client_addr;
my $val = 100;

while ($client_addr = accept(NEW_SOCKET, SOCKET)) {
   # send them a message, close connection
   my $name = gethostbyaddr($client_addr, AF_INET );
   print NEW_SOCKET "Smile from the server";
   print NEW_SOCKET $val;
   print "Connection recieved from $name\n";
   close NEW_SOCKET;
}
客户

#!/usr/bin/perl -w
# Filename : client.pl

use strict;
use IO::Socket;
use Socket;
use Sys::Hostname;
use constant BUFSIZE => 1024;

# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 7890;
my $server = "localhost";  # Host IP running the server

# create the socket, connect to the port
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
   or die "Can't create a socket $!\n";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
   or die "Can't connect to port $port! \n";

my $line;
my $req = 1000;
while ($line = <SOCKET>) {
        print "$line\n";
}
close SOCKET or die "close: $!";
#/usr/bin/perl-w
#文件名:client.pl
严格使用;
使用IO::Socket;
使用插座;
使用Sys::Hostname;
使用常量BUFSIZE=>1024;
#初始化主机和端口
my$host=shift | |“localhost”;
我的$port=shift | | 7890;
我的$server=“localhost”#运行服务器的主机IP
#创建套接字,连接到端口
套接字(套接字、PF_INET、SOCK_流,(getprotobyname('tcp'))[2])
或“无法创建套接字$!\n”;
连接(SOCKET,pack_sockaddr_in($port,inet_aton($server)))
或“无法连接到端口$port!\n”;
我的美元线;
我的$req=1000;
而($line=){
打印“$line\n”;
}
关闭插座或模具“关闭:$!”;

以下是一个基本示例。下面的代码增加了您所拥有的功能,但请注意,模块或核心使其比您使用的较低级别调用更容易

对代码的唯一更改(下面显示的除外)是从
SOCKET
到词法
my$SOCKET
,并且在
while
条件中移动现有声明

每个服务器-客户机系统都需要一个协议,一个消息交换方式的安排。在这里,一旦客户端连接,服务器就会发送一条消息,然后它们交换单个打印

server.pl

# ... code from the question, with $socket instead of SOCKET

use IO::Handle;  # for autoflush

while (my $client_addr = accept(my $new_socket, $socket)) 
{
   $new_socket->autoflush;
   my $name = gethostbyaddr($client_addr, AF_INET );
   print "Connection received from $name\n";

   print $new_socket "Hello from the server\n";

   while (my $recd = <$new_socket>) {
       chomp $recd;
       print "Got from client: $recd\n";

       print $new_socket "Response from server to |$recd|\n";
   }   
   close $new_socket;
}
这与预期的一样。客户端在收到三条消息后退出,服务器保持等待状态。如果您确实希望只写一次,请使用简单的打印和读取替换
while
循环

交易所可以更加复杂,见最后链接的perlipc中的例子

几点意见

  • 使用上面提到的模块使这变得更容易

  • 法拉盛过程中的任何故障都可能导致死锁,其中一方写了信,等待阅读,而另一方没有收到信息,仍在管道中等待阅读

  • 检查一切。为了简洁起见,所有检查都省略了

  • 使用警告
    -w
    开关更好。见


这只是为了回答如何实现它们之间的通信的问题。一个很好的学习资源是,它也有一个。相关模块的文档也提供了大量信息。

提示:通过使用
socket(my$socket,…)
而不是
socket(socket,…)
,避免全局变量。提示:使事情简单得多。您当前从客户端的socket读取数据,然后写入服务器的socket。您还可以在客户机中写入套接字,并从服务器中的套接字读取。插座是双向的。
# ... same as in question, except for $socket instead of SOCKET

use IO::Handle;
$socket->autoflush;

my $cnt = 0;
while (my $line = <$socket>) {
    chomp $line;
    print "Got from server: $line\n";
    last if ++$cnt > 3;                # made up condition to quit

    print $socket "Hello from client ($cnt)\n";
}
close $socket or die "close: $!";