Perl을 사용한 게임 엔진 개발: 6부 - 다채로운 Telnet 서버

내가 무엇을 하고 있는지 모르겠다.

처음부터 읽고 싶다면. 체크 아웃

ANSI 게임 엔진이란?



ANSI Game Engine의 핵심은 매우 다채롭고 대화식 텔넷 서버입니다.

왜 텔넷!?

알아요!? 나는 지금도 같은 질문을 스스로에게 하고 있지만, 이 시점에서 나는 어느 정도 결심을 하고 있다. 처음에는 클라이언트 측을 코딩하지 않기로 결정했습니다. 찾아보니 내가 하고 싶은 일이 아니었다. 그리고 솔직히 말해서, Perl에 대한 내 편안함 수준을 너무 벗어나는 것 같았습니다. 다른 Perl 개발자의 경우처럼 서버 측 코드로 작업하는 것이 훨씬 더 편안하고 관심이 있습니다. 그것이 Perl이 꽤 많은 곳입니다. 내가 ANSI graphics 으로 가고 있었기 때문에, 그것들은 적어도 나에게는 요즘 텔넷/터미널 클라이언트와 BBS's 이 주로 텔넷 기반으로 사용되는 것으로 가장 잘 알려져 있습니다. 즉, SyncTERM을 만나기 전에 Google을 검색하는 데 오랜 시간이 걸리지 않았습니다. 제 생각에는 SyncTERM이 텔넷을 통한 ANSI 그래픽의 플랫폼 간 렌더링에 가장 적합한 선택입니다. Mac, Windows 및 Linux에서 다양한 클라이언트를 사용해 보았습니다. SyncTERM은 이러한 플랫폼에서 가장 일관되게 작동하며 오랫동안 사용되어 왔으며 여전히 활발히 개발되고 있습니다. 그래서 텔넷입니다!

텔넷.... 포크 날...

엔진은 멀티플레이어여야 합니다. 특정 게임 요구 사항에 따라 이것은 반드시 플레이어가 서로 상호 작용하는 것을 의미하지는 않지만 적어도 여러 플레이어가 동시에 동일한 서버에 연결되어 있어야 합니다. 이것은 최소 초기 요구 사항입니다. 저에게 이것은 Fork 과 함께 일할 수 있는 좋은 기회입니다. 서로 상호 작용할 수 있는 포크로 여러 프로세스를 만드는 아이디어가 정말 좋습니다. 이것은 제가 경험이 거의 없고 배울 수 있는 좋은 기회입니다.

Perl의 CPAN에 대해 들어보셨나요?

Perl 개발자라면 당연히 그렇습니다. 다른 언어로 코딩하는 경우 들어본 적이 있을 것입니다. Comprehensive Perl Archive Network 또는 CPAN은 Perl의 코드 모듈 저장소입니다. 무언가를 하고 싶다면 누군가 이미 모듈을 만들었을 가능성이 있습니다. 이 기사를 작성하는 현재 CPAN에는 14,179명의 작성자가 작성한 208,034개의 Perl 모듈이 있습니다. 정말 놀랍습니다!

여기에서 텔넷 서버를 개발하기 위한 모듈을 찾았습니다. 포크 텔넷 서버, 믿을 수 있습니까? 포크 야! Okokok.... 농담은 그만할게, 약속해!

코딩을 해보자!

첫 번째 단계는 여러 동시 연결을 허용할 수 있는 텔넷 서버를 확보하는 것이었습니다. Perl을 사용하여 텔넷 서버를 만드는 방법에 대해 읽었고 그 읽기에서 IO::Socket::INET에 대해 빠르게 배웠습니다. 텔넷 서버에 대한 작업 코드가 생긴지 얼마 되지 않았습니다!

use strict;
use warnings;
use IO::Socket::INET;
print "\nBEGIN\n";

print "Setting up listen socket\n";
my $socket = new IO::Socket::INET (
    LocalHost => '192.168.1.15',
    LocalPort => '27777',
    Proto => 'tcp',
    Listen => SOMAXCONN,
    ReuseAddr => 1
);

my $player_socket;
my $player_data;

print "Waiting for connection ...\n";
while(1) {

    next unless $player_socket = $socket->accept();
    print "Incomming Connection!\n";

    my $player_address = $player_socket->peerhost();
    my $player_port    = $player_socket->peerport();

    my $response = "Player Connection Info: $player_address : $player_port. ";
    print "$response\n";

    $response .= "Press Any Key To Disconnect...\n";
    $player_socket->send($response);

    print "Waiting for player to press a key and disconnect...\n";
    while ($player_socket->connected()) {

        $player_socket->recv($player_data, 1024);
        if ($player_data) {
            print "Player Disconnecting $player_address : $player_port\n";
            $socket->close();
            print "Player Disconnected\n";
            last;
        }

    }
    last;
}
print "Good Bye!\n";
exit;


이 코드를 실행하고 SyncTERM과 연결하면 다음이 표시됩니다.

localhost:~ # perl telnet_server.pl 

BEGIN
Setting up listen socket
Waiting for connection ...
Incomming Connection!
Player Connection Info: 192.168.1.9 : 55414. 
Waiting for player to press a key and disconnect...
Player Disconnecting 192.168.1.9 : 55414
Player Disconnected
Good Bye!





나는 listen(2)에 대한 내 서버의 매뉴얼 페이지를 읽었으며 내가 이해할 수있는 최선은 Listen => SOMAXCONN 의 SOMAXCONN 값이 최대 4096 개의 연결을 허용한다는 것입니다!? 나는 이것이 맞다고 생각한다. 값은 /proc/sys/net/core/somaxconn에서 찾을 수 있으며 해당 파일의 cat을 수행하면 4096이 표시됩니다.

localhost:~ # cat /proc/sys/net/core/somaxconn 
4096



이제 포크만 하면 됩니다!

이 프로세스는 (저에게는) 이해하기가 조금 더 어려운 것으로 판명되었으며 몇 줄의 코드가 telnet 부분을 수행했습니다. 다음 기사에서 여기에서 선택하겠습니다.

이전에 텔넷 프로그래밍을 해본 적이 있습니까? 그렇다면 어떤 모듈이 유용하다고 생각했습니까? (CPAN 또는 기타)

제안이나 의견이 있으면 건설적으로 공유하십시오. 또한 게임 엔진이 작동하는 모습을 보여주는 재미있는 비디오와 사진을 많이 보려면 소셜 미디어 페이지를 방문하십시오.

ANSI Game Engine on Facebook


건배!

좋은 웹페이지 즐겨찾기