# 소켓

- 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()를 통해서 서버 소켓에 연결합니다.