- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
Socket 又称 套接字,应用程序通常通过 套接字 向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
本章节我们将开始学习 Perl 中的 套接字编程
Perl 中创建服务器端 socket 一般需要经过以下步骤:
1、 使用socket函数来创建socket服务;
2、 使用bind函数绑定端口;
3、 使用listen函数监听端口;
4、 使用accept函数接收客户端请求;
Perl 中创建客户端 socket 一般需要经过以下步骤:
1、 使用socket函数来创建socket服务;
2、 使用connect函数连接到socket服务端;
Perl 中,socket() 函数用来创建套接字
socket( SOCKET, DOMAIN, TYPE, PROTOCOL );
DOMAIN
创建的套接字指定协议集。 套接字协议有以下几种:
TYPE
套接字类型 可以根据是面向连接的还是非连接分为 SOCK_STREAM 或 SOCK_DGRAM 也就是俗称的 tcp 和 udp
PROTOCOL
指定实际使用的传输协议,是 (getprotobyname('tcp'))[2] 返回的结果
因此,socket 函数调用方式如下:
use Socket # 定义了 PF_INET 和 SOCK_STREAM
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
Perl 中的 bind() 函数为套接字分配一个地址
bind( SOCKET, ADDRESS );
SOCKET
一个socket的描述符,函数 socket() 的返回值
ADDRESS
是socket 地址 ( TCP/IP ) 包含了三个元素:
使用socket() 函数创建套接字后,只赋予其所使用的协议,并未分配地址。 在接受其它主机的连接前,必须先调用 bind() 为套接字分配一个地址
use Socket # 定义了 PF_INET 和 SOCK_STREAM
$port = 6288; # 监听的端口
$server_ip_address = "0.0.0.0";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
or die "无法绑定端口! \n";
当socket 和一个地址绑定之后,listen()函数会开始监听可能的连接请求。
但这只能在有可靠数据流保证的时候使用:
listen( SOCKET, QUEUESIZE );
SOCKET
一个socket的描述符,socket() 函数调用返回的结果
QUEUESIZE
是一个决定监听队列大小的整数,当有一个连接请求到来,就会进入此监听队列; 当一个连接请求被 accept()接受,则从监听队列中移出; 当队列满后,新的连接请求会返回错误
一旦连接被接受,返回 0 表示成功,错误返回 -1
accept() 函数接受请求的socket连接。
如果成功则返回压缩形式的网络地址,否则返回 FALSE
accept( NEW_SOCKET, SOCKET );
SOCKET
一个socket的描述符,socket() 函数调用返回的结果
ADDRESS
ADDRESS 是 socket 地址 ( TCP/IP ) 包含了三个元素:
while(1) {
accept( NEW_SOCKET, SOCKT );
.......
}
介绍了一系列的函数,现在我们用这些函数创建一个服务器端 socket
#!/usr/bin/perl
=pod
file: serv.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
use strict;
use Socket;
# 使用端口 6288 作为默认值
my $port = shift || 6288;
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;
}
新开一个终端,输入以下命令运行 serv.pl
$ perl serv.pl
访问启动:6288
connect() 函数调用为一个套接字设置连接,参数有文件描述符和主机地址
connect( SOCKET, ADDRESS );
下面的代码创建了一个连接到服务器 127.0.0.1:6288 的连接
$port = 6288;
$server_ip_address = "127.0.0.1";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
or die "无法绑定端口! \n";
我们已经创建了一个监听 127.0.0.1:6288 的服务器, 现在我们使用以下代码访问它们
#!/usr/bin/perl
=pod
file: serv.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
use strict;
use Socket;
# 初始化地址与端口
my $host = shift || 'localhost';
my $port = shift || 6288;
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
我是来自服务端的信息
我正在尝试打印 timeval 类型的值。实际上我可以打印它,但我收到以下警告: 该行有多个标记 格式“%ld”需要“long int”类型,但参数 2 的类型为“struct timeval” 程序
我正在编写自己的 unix 终端,但在执行命令时遇到问题: 首先,我获取用户输入并将其存储到缓冲区中,然后我将单词分开并将它们存储到我的 argv[] 数组中。IE命令是“firefox”以启动存储在
我是 CUDA 的新手。我有一个关于一个简单程序的问题,希望有人能注意到我的错误。 __global__ void ADD(float* A, float* B, float* C) { con
我有一个关于 C 语言 CGI 编程的一般性问题。 我使用嵌入式 Web 服务器来处理 Web 界面。为此,我在服务器中存储了一个 HTML 文件。在此 HTML 文件中包含 JavaScript 和
**摘要:**在代码的世界中,是存在很多艺术般的写法,这可能也是部分程序员追求编程这项事业的内在动力。 本文分享自华为云社区《【云驻共创】用4种代码中的艺术试图唤回你对编程的兴趣》,作者: break
我有一个函数,它的任务是在父对象中创建一个变量。我想要的是让函数在调用它的级别创建变量。 createVariable testFunc() [1] "test" > testFunc2() [1]
以下代码用于将多个连续的空格替换为1个空格。虽然我设法做到了,但我对花括号的使用感到困惑。 这个实际上运行良好: #include #include int main() { int ch, la
我正在尝试将文件写入磁盘,然后自动重新编译。不幸的是,某事似乎不起作用,我收到一条我还不明白的错误消息(我是 C 初学者 :-)。如果我手动编译生成的 hello.c,一切正常吗?! #include
如何将指针值传递给结构数组; 例如,在 txt 上我有这个: John Doe;xxxx@hotmail.com;214425532; 我的代码: typedef struct Person{
我尝试编写一些代码来检索 objectID,结果是 2B-06-01-04-01-82-31-01-03-01-01 . 这个值不正确吗? // Send a SysObjectId SNMP req
您好,提前感谢您的帮助, (请注意评论部分以获得更多见解:即,以下示例中的成本列已添加到此问题中;西蒙提供了一个很好的答案,但成本列本身并未出现在他的数据响应中,尽管他提供的功能与成本列一起使用) 我
我想知道是否有人能够提出一些解决非线性优化问题的软件包的方法,而非线性优化问题可以为优化解决方案提供整数变量?问题是使具有相等约束的函数最小化,该函数受某些上下边界约束的约束。 我已经在R中使用了'n
我是 R 编程的初学者,正在尝试向具有 50 列的矩阵添加一个额外的列。这个新列将是该行中前 10 个值的平均值。 randomMatrix <- generateMatrix(1,5000,100,
我在《K&R II C 编程 ANSI C》一书中读到,“>>”和“0; nwords--) sum += *buf++; sum = (sum >>
当下拉列表的选择发生变化时,我想: 1) 通过 div 在整个网站上显示一些 GUI 阻止覆盖 2)然后处理一些代码 3) 然后隐藏叠加层。 问题是,当我在事件监听器函数中编写此逻辑时,将执行 onC
我正在使用 Clojure 和 RESTEasy 设计 JAX-RS REST 服务器. 据我了解,用 Lisp 系列语言编写的应用程序比用“传统”命令式语言编写的应用程序更多地构建为“特定于领域的语
我目前正在研究一种替代出勤监控系统作为一项举措。目前,我设计的用户表单如下所示: Time Stamp Userform 它的工作原理如下: 员工将选择他/她将使用的时间戳类型:开始时间、超时、第一次
我是一名学生,试图自学编程,从在线资源和像您这样的人那里获得帮助。我在网上找到了一个练习来创建一个小程序来执行此操作: 编写一个程序,读取数字 a 和 b(长整型)并列出 a 和 b 之间有多少个数字
我正在尝试编写一个 shell 程序,给定一个参数,打印程序的名称和参数中的每个奇数词(即,不是偶数词)。但是,我没有得到预期的结果。在跟踪我的程序时,我注意到,尽管奇数词(例如,第 5 个词,5 %
只是想知道是否有任何 Java API 可以让您控制台式机/笔记本电脑外壳上的 LED? 或者,如果不可能,是否有可能? 最佳答案 如果你说的是前面的 LED 指示电源状态和 HDD 繁忙状态,恐怕没
我是一名优秀的程序员,十分优秀!