Files
perl-examples/docs/20_socket.md
2025-02-10 05:29:29 +09:00

114 lines
2.3 KiB
Markdown

# 소켓
- socket(소켓, 도메인, 타입, 프로토콜)
- 도메인: `PF_INET`으로 지정합니다.
- 타입: TCP/IP 연결을 사용하기 위해서는 `SOCK_STREAM`으로 지정합니다.
- 프로토콜: `getprotobyname('tcp')`
- bind(소켓, 어드레스)
```perl
bind($socket, pack_sockaddr_in(9999, inet_aton('123.456.789.1')));
```
- listen(소켓, 큐사이즈)
- 큐사이즈: 동시 연결 가능한 최대 숫자를 지정합니다.
- accept(클라이언트소켓, 서버소켓)
일반적으로, 무한 루프 안에서 사용됩니다.
```perl
while (1){
accept($client_socket, $server_socket);
}
```
- connect(소켓, 주소)
- recv
- send
- shutdown, close
- inet_aton
문자열 형식의 주소를 `pack_sockaddr_in()`에 전달하기 위한 바이너리 형식으로 변환합니다.
- inet_ntoa
- inet_pton
첫 번째 매개변수는 `AF_INET` 또는 `AF_INET6`입니다.
- inet_ntop
## Server
```perl
#!/usr/bin/perl
use warnings;
use strict;
use Socket;
my $port = 9999;
#
my $server;
socket($server, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
bind($server, sockaddr_in($port, INADDR_ANY)) or die $!;
listen($server, 10);
while(1) {
my $client;
my $paddr = accept($client, $server);
my($port, $iaddr) = sockaddr_in($paddr);
my $name = gethostbyaddr($iaddr, AF_INET);
print $client "Smile from the server";
print "Connection recieved from $name\n";
close $client;
}
# https://perldoc.perl.org/perlipc#Sockets%3A-Client%2FServer-Communication
```
- socket()으로 소켓을 만듭니다.
- bind()는 소켓과 포트 번호를 연결합니다.
- listen()을 실행해서 해당 포트에 대해 수신 대기 상태로 만듭니다.
- accept()를 사용해서 클라이언트와 연결합니다.
## Client
```perl
#!/usr/bin/perl
use warnings;
use strict;
use Socket;
my $port = 9999;
my $host = "localhost";
my $socket;
my $iaddr = inet_aton($host);
my $paddr = sockaddr_in($port, $iaddr);
socket($socket, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
connect($socket, $paddr) or die $!;
my $line;
while ($line = <$socket>) {
print "$line\n";
}
close $socket or die "close: $!";
exit (0);
```
- socket()으로 소켓을 만듭니다.
- connect()를 통해서 서버 소켓에 연결합니다.