Latest web development tutorials

펄 소켓 프로그래밍

호스트 사이에 또는 컴퓨터의 프로세스가 통신 할 수 있도록 또한 "소켓"라고도 소켓은 애플리케이션이 일반적으로, 네트워크 요청 또는 응답 네트워크 요구에 "소켓"에 의해 발행된다.

이 섹션에서는 우리가 어떻게 소켓 서비스를 사용하는 펄 언어를받은 모든입니다.


서버 만들기

  • 소켓 서비스를 만들소켓 기능을 사용합니다.

  • 포트를 바인드bind 함수를 사용합니다.

  • 포트 기능을듣고들을 수 있습니다.

  • 함수는 클라이언트 요청을 수신받아 사용한다.

클라이언트 만들기

  • 소켓 서비스를 만들소켓 기능을 사용합니다.

  • 연결 기능을 사용하면 서버 소켓에 연결합니다.

다음 표는 클라이언트와 서버 간의 통신 흐름을 예시한다 :


서버 소켓 기능

소켓 기능

다음 펄, 우리는 소켓을 생성하기 위해 소켓 () 함수를 사용하여, 구문은 다음과

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

분석 매개 변수 :

  • 만든 프로토콜 설정 소켓 도메인을 지정합니다. 예를 들면 :

    • AF_INET IPv4 네트워크 프로토콜을 나타낸다
    • AF_INET6 IPv6에 대한
    • AF_UNIX (a 파일을 사용하여) 로컬 소켓을 나타낸다

  • TYPE 소켓 타입은 SOCK_STREAM이나 SOCK_DGRAM으로 연결 지향 또는 연결없는 될 수 있습니다

  • 프로토콜(과 getprotobynumber ( 'TCP'))해야한다 [2].실제 전송 프로토콜을 지정합니다.

다음 소켓 함수 호출 : 그래서

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);

바인드 () 함수

소켓에 주소를 할당) (바인딩을 사용하여

bind( SOCKET, ADDRESS );

소켓 기술자를 소켓. ADDRESS 소켓 주소 (TCP / IP)의 세 가지 요소를 포함한다 :

  • 주소 패밀리 (시스템이 될 수 있습니다에 TCP / IP는 AF_INET이다)

  • 포트 번호 (예 : 21 등)

  • 네트워크 주소 (예를 10.12.12.168 등)

소켓 () 소켓을 만들고 사용 후, 단지 그들이 사용하고 주소를 할당하지 않는 프로토콜을 제공합니다. 다른 호스트 연결을 수락하기 전에, 먼저) (바인드를 호출 할 필요가 소켓에 주소를 할당합니다.

다음과 같이 간단한 예는 다음과 같습니다

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";

또는 실행에 실패한 바인드 주소에 죽는다.

포트를 설정으로 setsockopt () SO_REUSEADDR 옵션을 설정하여 바로 재사용 할 수있다.

pack_sockaddr_in () 함수는 바이너리 형식으로 주소를 변환합니다.

수신 () 함수

소켓과 주소를 바인딩 할 때, 듣고 () 함수는 가능한 연결 요청을 수신하기 시작합니다. 사용시 그러나, 이것은 신뢰성있는 데이터의 스트림을 보장 할 수있다 :

listen( SOCKET, QUEUESIZE );

소켓 : 소켓 기술자.

QUEUESIZE는 : 큐는 새로운 연결 차면; 접속 요구 큐 모니터 제거 받아들이) (접수되면 정수 연결 요청이 도착이있을 때, 그 수신 대기열을 입력 할 경우, 큐의 크기를 모니터링하는 결정 인 요청은 오류를 반환합니다.

연결이 허용되면, 성공, 오류 리턴 -1 0을 반환합니다.

동의 () 함수

수락 () 함수는 요청 소켓 연결을 수용한다. 네트워크 주소 압축 된 형태에 성공하면, 그렇지 않으면 FALSE를 반환합니다 :

accept( NEW_SOCKET, SOCKET );

소켓 : 소켓 기술자.

주소 : 주소는 소켓 주소 (TCP / IP)는 세 가지 요소를 포함한다 :

  • 주소 패밀리 (시스템이 될 수 있습니다에 TCP / IP는 AF_INET이다)

  • 포트 번호 (예 : 21 등)

  • 네트워크 주소 (예를 10.12.12.168 등)

일반적으로 무한 루프에 적용되는 () 동의 :

while(1) {
   accept( NEW_SOCKET, SOCKT );
   .......
}

상기 예는 클라이언트 요청을 실시간으로 모니터링 할 수있다.


클라이언트 기능

연결 () 함수

소켓 연결 매개 변수 파일 기술자와 호스트 주소를 설정 () 시스템 호출을 연결합니다.

connect( SOCKET, ADDRESS );

다음은 서버 인스턴스 소켓 연결을 생성한다 :

$port = 21;    #  ftp 端口
$server_ip_address = "10.12.12.168";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
    or die "无法绑定端口! \n";

전체 예제

다음으로 우리는 완전한 예제를 통해 모든 소켓 응용 프로그램 기능을 이해하게 :

서버 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

클라이언트 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
我是来自服务端的信息