English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Erlang 포트(Port)

Erlang에서 포트는 다른 프로그램 간의 통신에 사용됩니다. 소켓은 통신 단점으로, 컴퓨터가 인터넷 프로토콜(IP)을 통해 인터넷을 통해 통신할 수 있도록 허용합니다.

포트에서 사용하는 프로토콜 유형

통신에 사용할 수 있는 두 가지 프로토콜이 있습니다. 하나는 UDP, 다른 하나는 TCP입니다. UDP는 애플리케이션 간에 짧은 메시지(데이터 패킷으로 불립니다)를相互 전송할 수 있지만, 이 메시지의 전달을 보장할 수 없습니다. 또한, 문제가 발생할 수도 있습니다. 반면, TCP는 연결이 설정되면 바이트 스트림을 제공하며, 바이트는 순서대로 전달됩니다.

UDP를 사용하여 포트를 열는 간단한 예제를 보겠습니다.

예시

-module(helloworld). 
-export([start/0]). 
start() ->
   {ok, Socket} = gen_udp:open(8789, 
   io:fwrite("~p",[Socket]), 
   io:fwrite("~p",[gen_udp:send 
   (소켓,"localhost",8789,"Hello")]).

출력

위 프로그램의 출력은 다음과 같습니다.

#Port<0.376>ok

포트에서 메시지를 받기

포트를 열고 나면, 포트에서 메시지를 받을 수 있습니다. 이는 recv 메서드를 통해 완료됩니다. 문법과 다음 예제를 확인해 보겠습니다.

문법

recv(Socket, 길이)

파라미터

  • 소켓 −이 gen_udp:open 명령어를 사용하여 생성된 소켓입니다.

  • Length −받아야 할 메시지의 길이는 이렇습니다.

반환 값

메시지가 올바르게 전송되면 확인 메시지를 반환합니다.

예를 들어

-module(helloworld). 
-export([start/0]). 
start() ->
   {ok, Socket} = gen_udp:open(8789, 
   io:fwrite("~p",[Socket]), 
   io:fwrite("~p",[gen_udp:send(Socket,"localhost",8789,"Hello")]),
   io:fwrite("~p",[gen_udp:recv(Socket, 20)]).

전체 프로그램

현재 같은 프로그램에서 동일한 전송과 수신 메시지를 가질 수 없습니다. 다른 프로그램에서 정의해야 합니다. 따라서 다음과 같은 코드를 생성하여 메시지를 수신하는 서버 구성 요소와 메시지를 전송하는 클라이언트 구성 요소를 생성하겠습니다.

예시

-module(helloworld). 
-export([start/0,client/1]). 
start() -> 
   spawn(fun() -> server(4000) end).
server(Port) ->
   {ok, Socket} = gen_udp:open(Port, [binary, {active, false}]), 
   server socket~=~~p~n 
   loop(Socket). 
loop(Socket) ->
   inet:setopts(Socket, [{active, once}]), 
   receive 
      {udp, Socket, Host, Port, Bin} -> 
      server received:~p~n 
      gen_udp:send(Socket, Host, Port, Bin), 
      loop(Socket) 
   끝. 
client(N) -> 
   {ok, Socket} = gen_udp:open(0, [binary]), 
   client socket~=~~p~n 이후 
   ok = gen_udp:send(Socket, "localhost", 4000, N), Value = receive 
      {udp, Socket, _, _, Bin} ->
         client received:~p~n 이후 2000 ->
      0 
   end, 
   
gen_udp:close(Socket), 
Value.

위의 프로그램에 대해 주의해야 할 몇 가지 사항이 있습니다.

  • 우리는 두 가지 함수를 정의했습니다. 첫 번째는 서버 함수로, 포트를 수신하기 위해 사용됩니다.4000. 두 번째는 클라이언트로, 서버 구성 요소에 "Hello" 메시지를 보내기 위해 사용됩니다.

  • 수신 루프는 정의된 루프 내에서 전송된 메시지를 읽기 위해 사용됩니다.

출력

이제 두 창에서 프로그램을 실행해야 합니다. 첫 번째 창은 Erlang 명령 프롬프트 창에서 다음 코드를 실행하여 서버 구성 요소를 실행합니다.

helloworld:start().

이는 명령 프롬프트 창에 다음 출력을 표시합니다.

서버가 소켓을 열었습니다: #Port<0.2314>

이제, 두 번째 Erlang 명령 프롬프트 창에서 다음 명령어를 실행하세요.

Helloworld:client(<<"Hello">}).

이 명령어를 실행할 때, 다음 출력이 첫 번째 명령 프롬프트 창에 표시됩니다.

서버가 <<"Hello">>를 수신했습니다: