22-Perl Socket 编程
1.Perl Socket 编程
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
本章节我们为大家接收 Perl 语言中如何使用 Socket 服务。
1.1创建服务端
使用 socket 函数来创建 socket服务。
使用 bind 函数绑定端口。
使用 listen 函数监听端口。
使用 accept 函数接收客户端请求。
1.2创建客户端
使用 socket 函数来创建 socket 服务。
使用 connect 函数连接到 socket 服务端。
1.3 以下图表演示了客户端与服务端之间的通信流程:
Client Server
socket() socket()
| bind()
| listen()
connect() accept()
Read/Write Data --><-- Read/Write Data
close() close()
2.服务端 socket 函数
2.1socket 函数
Perl 中,我们用 socket()函数来创建套接字,语法格式如下:
socket( SOCKET, DOMAIN, TYPE, PROTOCOL );
参数解析:
DOMAIN 创建的套接字指定协议集。 例如:
AF_INET 表示IPv4网络协议
AF_INET6 表示IPv6
AF_UNIX 表示本地套接字(使用一个文件)
TYPE 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
PROTOCOL 应该是 (getprotobyname('tcp'))[2]。指定实际使用的传输协议。
所以 socket 函数调用方式如下:
use Socket # 定义了 PF_INET 和 SOCK_STREAM
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
2.2 bind() 函数
使用 bind() 为套接字分配一个地址:
bind( SOCKET, ADDRESS );
SOCKET 一个socket的描述符。 ADDRESS 是 socket 地址 ( TCP/IP ) 包含了三个元素:
地址簇 (TCP/IP, 是 AF_INET, 在你系统上可能是 2)
端口号 (例如 21)
网络地址 (例如 10.12.12.168)
使用socket()创建套接字后,只赋予其所使用的协议,并未分配地址。在接受其它主机的连接前,必须先调用bind()为套接字分配一个地址。
简单实例如下:
use Socket # 定义了 PF_INET 和 SOCK_STREAM
$port = 12345; # 监听的端口
$server_ip_address = "10.12.12.168";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address))) or die "无法绑定端口! \n";
or die 在绑定地址失败后执行。
通过设置 setsockopt() 可选项 SO_REUSEADDR 设置端口可立即重复使用。
pack_sockaddr_in() 函数将地址转换为二进制格式。
2.3 listen() 函数
当socket和一个地址绑定之后,listen()函数会开始监听可能的连接请求。然而,这只能在有可靠数据流保证的时候使用:
listen( SOCKET, QUEUESIZE );
SOCKET : 一个socket的描述符。
QUEUESIZE : 是 一个决定监听队列大小的整数,当有一个连接请求到来,就会进入此监听队列;当一个连接请求被accept()接受,则从监听队列中移出;当队列满后,新的连接请求会返回错误。
一旦连接被接受,返回0表示成功,错误返回-1。
2.4 accept() 函数
accept() 函数接受请求的socket连接。如果成功则返回压缩形式的网络地址,否则返回FALSE:
accept( NEW_SOCKET, SOCKET );
NEW_SOCKET : 一个socket的描述符。
SOCKET : 一个socket的描述符。
accept() 通常应用在无限循环当中:
while(1) {
accept( NEW_SOCKET, SOCKT );
.......
}
以上实例可以实时监听客户端的请求。
3.客户端函数
3.1 connect() 函数
connect()系统调用为一个套接字设置连接,参数有文件描述符和主机地址。
connect( SOCKET, ADDRESS );
以下创建一个连接到服务端 socket 的实例:
$port = 21; # ftp 端口
$server_ip_address = "10.12.12.168";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
or die "无法绑定端口! \n";
4.完整实例
接下来我们通过一个完整实例来了解下所有 socket 函数的应用:
4.1 服务端 server.pl 代码:
#!/usr/bin/perl -w
# Filename : server.pl
use strict;
use Socket;
# 使用端口 7890 作为默认值
my $port = shift || 7890;
my $proto = getprotobyname('tcp');
my $server = "localhost"; # 设置本地地址
# 创建 socket, 端口可重复使用,创建多个连接
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
or die "无法打开 socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1)
or die "无法设置 SO_REUSEADDR $!\n";
# 绑定端口并监听
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "无法绑定端口 $port! \n";
listen(SOCKET, 5) or die "listen: $!";
print "访问启动:$port\n";
# 接收请求
my $client_addr;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) {
# send them a message, close connection
my $name = gethostbyaddr($client_addr, AF_INET );
print NEW_SOCKET "我是来自服务端的信息";
print "Connection recieved from $name\n";
close NEW_SOCKET;
}
打开一个终端,执行以下代码:
$ perl sever.pl
访问启动:7890
4.2 客户端 client.pl 代码:
#!/usr/bin/perl -w
# Filename : client.pl
use strict;
use Socket;
# 初始化地址与端口
my $host = shift || 'localhost';
my $port = shift || 7890;
my $server = "localhost"; # 主机地址
# 创建 socket 并连接
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
or die "无法创建 socket $!\n";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "无法连接:port $port! \n";
my $line;
while ($line = <SOCKET>) {
print "$line\n";
}
close SOCKET or die "close: $!";
打开另外一个终端,执行以下代码:
$ perl client.pl
我是来自服务端的信息
22-Perl Socket 编程的更多相关文章
- Perl socket编程
In this article, let us discuss how to write Perl socket programming using the inbuilt socket module ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- [转]C语言SOCKET编程指南
1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...
- socket编程基础
socket编程 什么是socket 定义 socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求. socket起源于Unix ...
- C语言SOCKET编程指南
1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...
- python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)
1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 #python2 print("python2---抽象类".center(2 ...
- 揭开Socket编程的面纱
对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1. 什么是TCP/IP.UDP? 2. Socket在哪里呢? 3. Sock ...
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- day8---多线程socket 编程,tcp粘包处理
复习下socket 编程的步骤: 服务端: 1 声明socket 实例 server = socket.socket() #括号里不写 默认地址簇使用AF_INET 即 IPv4 ...
随机推荐
- QList和QVector等容器的区别
QList和QVector等容器的区别. 1.大多数情况下可以用QList.像prepend()和insert()这种操作,通常QList比QVector快的多.这是因为QList是基于index标签 ...
- antd源码分析之——标签页(tabs 3.Tabs的滚动效果)
由于ant Tabs组件结构较复杂,共分三部分叙述,本文为目录中第三部分(高亮) 目录 一.组件结构 antd代码结构 rc-ant代码结构 1.组件树状结构 2.Context使用说明 3.rc-t ...
- WEditor使用方法
APP的定位方式有: 1. Appium Desktop工具里的Inspector 2. /tools/bin/uiautomatorviewer.bat 最近发现在一个更好用的定位工具: Wedit ...
- 001-tomcat下载、解压、启动、开机启动
一.tomcat作用 Tomcat就是Servlet容器 下载解压 下载:找到合适版本下载使用即可 http://tomcat.apache.org/ window 下载zip解压 linux上使用 ...
- —Entity Framework实例详解
Entity Framework Code First的默认行为是使用一系列约定将POCO类映射到表.然而,有时候,不能也不想遵循这些约定,那就需要重写它们.重写默认约定有两种方式:Data Anno ...
- 专业写博一天------ArrayList 线程安全
首先我们要了解什么是线程安全: 首先我们要明白线程的工作原理,jvm有一个main memory ,而每个线程有自己的working memory,一个线程对一个variable 进行操作时,都要 ...
- Top 5 Business Messaging Announcements at Facebook F8 2019
Top 5 Business Messaging Announcements at Facebook F8 2019 By Iaroslav Kudritskiy May 2, 2019 With t ...
- 模型蒸馏(Distil)及mnist实践
结论:蒸馏是个好方法. 模型压缩/蒸馏在论文<Model Compression>及<Distilling the Knowledge in a Neural Network> ...
- 深度学习之目标检测:非极大值抑制源码解析(nms)
目标检测:nms源码解析 原理:选定一个阈值,例如为0.3,然后将所有3个窗口(bounding box)按照得分由高到低排序.选中得分最高的窗口,遍历计算剩余的2窗口与该窗口的IOU,如果IOU大于 ...
- Power Management of Hybrid DRAM/PRAM-Based Main Memory
0.ABSTRACT (1)non-volatile memory——low standby power DRAM——high performance and better active power ...