telnet server, 1 Posts.

TCP/IP 텔넷 더미 서버

Date
2009/05/18 06:27
Author
ApPLe
Categories
어쩌..다가 ..
TCP/IP프로토콜을 이용 , 텔넷 더미 서버를 만드는 걸 하게 되었다.
그런데 시작해보니 .. 동기소켓(Sync socket)을 쓴다는것이 저번에 작업했던 와리가리 제어 서버 프로그램과 굉장히 비슷해서 쉽게할 수 있었다..

요구사항은 .. 일반 텔넷 클라이언트 프로그램으로 접속하여 로그인까지 .. 구현하는 것이었는데 .. 재미로 사족을 몇개 달아놓았다 ㅋㅋ

이놈이 서버 프로그램이 돌아가는모습.
서버는 리눅스 환경에서 돌아간다.
10001번 포트를 열고 접속을 받는다.


역시 리눅스 환경에 있는 telnet 클라이언트 프로그램으로 접속한 화면.
꽤나 그럴듯하게 환영메시지 ... 그리고 쉘까지 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아.. 이 참을수없는 텔넷훼이크의 즐거움 ㅋㅋㅋㅋ


ㅋㅋㅋ 무튼 재미있는 작업이었답 ㅎㅎ
소스코드는 밑에 있답 ㅎㅎ
C언어로 작성했다 ㅎㅎ

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#define READY_QUEUE 10
#define STRING_MAX 80
#define TRY_MAX 3

#define VALID_ID "drpark"
#define VALID_PW "1111"

enum
{
	FALSE ,
	TRUE
};

typedef struct sockaddr_in SOCKADDR;
typedef int SOCKID;
typedef int BOOL;

void RegistServer ( SOCKADDR *server , int nPort );
void MainLoop ( SOCKID sock_accp );
void SendServerMessage ( SOCKID accp_sock );
int Receive ( SOCKID sock_accp , char buf[] );

int main ( int argc , char **argv )
{
	SOCKADDR server , client;
	SOCKID sock_listen;
	SOCKID sock_accp;
	
	int nAddressLen;

	nAddressLen = sizeof(SOCKADDR);

	if ( argc != 2 )
	{
		printf ( "Invalid parameter : usage : %s [port_number]\n" , argv[0] );
		return 1;
	}

	// Socket listen mode
	sock_listen = socket ( PF_INET , SOCK_STREAM , 0 );

	// server data regist
	RegistServer ( &server , atoi ( argv[1] ) );

	// Binding
	if ( bind ( sock_listen , (struct sockaddr *)&server , sizeof(server)) < 0 )
	{
		printf ( "Bind failed : %d Port already in use.\n" , atoi ( argv[1] ) );
		return 1;
	}

	printf ( "ready for connection..\n" );

	// Listen
	listen ( sock_listen , READY_QUEUE );

	while ( 1 )
	{
		// Accept connection
		sock_accp = accept ( sock_listen , (struct sockaddr *)&client , &nAddressLen );

		printf ( "connected!\n" );

		// Send server Message
		SendServerMessage ( sock_accp );

		// Entry main loop
		MainLoop ( sock_accp );

		// close connection
		close ( sock_accp );

		printf ( "connection closed\n" );
	}
}

void RegistServer ( SOCKADDR *server , int nPort )
{
	bzero ( (char *)server , sizeof(*server) );
	server->sin_family = AF_INET;
	server->sin_addr.s_addr = htonl ( INADDR_ANY );
	server->sin_port = htons ( nPort );
}

void SendServerMessage ( SOCKID accp_sock )
{
	char buf[STRING_MAX];

	strcpy ( buf , "Welcome to dummy telnet server!\ntestID : drpark / testPW : 1111\n\n" );
	write ( accp_sock , buf , strlen(buf) );
}

void MainLoop ( SOCKID sock_accp )
{
	int nByte;
	int i;
	int cnt = 0;

	BOOL bIdExist = FALSE;
	BOOL bPwValid = FALSE;

	char buf[STRING_MAX];

	while ( 1 )
	{
		if ( cnt == TRY_MAX )
		{
			sprintf ( buf , "\n\nlogin failed %d time(s)..\nconnection refused!\n" , TRY_MAX );
			write ( sock_accp , buf , strlen(buf) );
			break;
		}

		strcpy ( buf , "login : " );
		write ( sock_accp , buf , strlen(buf) );
		Receive ( sock_accp , buf );
		
		if ( strcmp ( buf , VALID_ID ) != 0 )
		{
			printf ( "login tried : %s : fail\n" , buf );
			sprintf ( buf , "# login failed : not valid id !\n" );	

			write ( sock_accp , buf , strlen(buf) );
			cnt++;
			continue;
		}

		printf ( "valid id : ask password\n" );

		strcpy ( buf , "password : " );
		write ( sock_accp , buf , strlen(buf) );
		Receive ( sock_accp , buf );

		cnt = 0;

		if ( strcmp ( buf , VALID_PW ) != 0 )
		{
			printf ( "password tried : %s : fail\n" , buf );

			strcpy ( buf , "# login failed : not valid password!\n" );
			write ( sock_accp , buf , strlen(buf) );
			continue;
		}
		
		printf ( "login success.\n" );
		strcpy ( buf , "\n##### LOGIN SUCCESS !!!\nBUT THIS SERVER IS DUMMY.\n\n" );
		write ( sock_accp , buf , strlen(buf) );

		while ( 1 )
		{
			strcpy ( buf , "MINI::$ " );
			write ( sock_accp , buf , strlen(buf) );
			Receive ( sock_accp , buf );

			if ( strcmp ( buf , "shutdown" ) == 0 )
			{
				printf ( "client requests shutdown\n" );
				close ( sock_accp );
				exit ( 0 );
			}
			else if ( strcmp ( buf , "exit" ) == 0 )
			{
				break;
			}
			else if ( strcmp ( buf , "help" ) == 0 )
			{
				strcpy ( buf , "What do you want to me??????\nthis is dummy :)\n" );
				write ( sock_accp , buf , strlen(buf) );
			}
			else
			{
				strcpy ( buf , "MINI shell : syntax error : cannot find command\n" );
				write ( sock_accp , buf , strlen(buf) );
			}
		}

		break;

	}
}

int Receive ( SOCKID sock_accp , char buf[] )
{
	char temp[STRING_MAX];
	int nByte;
	int i;

	nByte = read ( sock_accp , temp , STRING_MAX );

	buf[0] = '\0';

	for ( i = 0 ; i < nByte-2 ; i++ )
	{
		buf[i] = temp[i];
		buf[i+1] = '\0';
	}

	return nByte;
}

ApPLe
2009/05/18 06:27 2009/05/18 06:27
Tag
Trackback
Comments
1