Linux ftp server 설치 및 사용법

   

리눅스가 9.x로 변화하면서 anonymous ftp 서버가 proftpd로 변경되었다.

 
    1. 
Linux FTP설치
 

        - 
anonymous ftp가 설치 되어 있지 않다면 여러분은 다음의 두 파일을 다운 받아 설치 해야 한다.

          
-anonftp-2.9-4ac.i386.rpm
          
-proftpd-1.2.0pre9-3ac.i386.rpm
 

  1. xxxxxxxxx.tar.gz, gz으로 압축된 파일이다. 주로 리눅스상에서 압축을 풀고 사용한다.
  2. xxxxxxxxx.src.rpm, 소스rpm파일이다. 소스 내용을 일부 수정해서 사용할 수 있다.
  3. xxxxxxxxx.i386.rpm, 소스 내용을 수정할 수 없는 패키지이다. i386은 인텔 i386호환기종을 말한다.
    대부분의 시스템들이 인텔 호한칩을 사용하고 있으므로 요걸 다운 받는다.

   

  • 이 파일 중에서anonyftp는 /home/ftp라는 디렉토리를 만들고 기본적인 ftp가 운용되도록 설정을 해주는 것이며 profptd는 anonymous로 접속하는 사용자들을 제어하고 anonymous서비스를 제공하는 ftp서버 프로그램이다.

    <rpm 설치 명령어>

    • #rpm -Uvh RPM_Name.rpm

         

    -패키지 설치확인 명령어-

    • #rpm -qa | grep 패키지 명

       

    -강제설치- 

    • #rpm --nodeps -Uvh 패키지.rpm
       
2. Linux FTP설정 

  - ftp서버도 마찬가지이다. conf파일만 수정하는 것으로 바로 운용이 가능하다.

  
다음 파일은 /etc/proftpd.conf의 내용이다.(OS 버전 별로 다를 수 있음.) 

[root@rootshell /root]#vi /etc/proftpd.conf

  

   

# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.

ServerName         "dacker.net"
ServerType         standalone
DefaultServer on

여기서 Server Name은 여러분의 ftp서버명을 말한다.
또한 서버타입은 standalone으로 하는 것이 슈퍼데몬(inetd)에 영향을 주지 않고 좋다.

# Use Pam Module (required /etc/pam.d/ftp)
# please read /usr/doc/proftpd-1.2pre3/mod_pam.c
#
AuthPAMAuthoritative on
사용자 인증에서 PAM을 사용할 것인지를 명시
# Port 21 is the standard FTP port.
Port                                21
기본 포트번호 21 반드시 외워라
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask                                022
파일을 생성하게 되면 기본적으로 주어지는 퍼미션을 umask라 한다.
022라고 설정 되어 있다면 퍼미션 644(-rw-r--r--)을 뜻한다.

# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances                        30
자식 프로세스 최대 생성수지정. 바람직하지 못한 서비스
공격 방지 , 수 초과시 log기록 연결 해제
# Set the user and group that the server normally runs at.

User                                nobody
Group                                nobody

proftpd 데몬을 실행시키는 사용자와 그룹 설정
# To show all filenames including ``dot'' files
#LsDefaultOptions "-a"

#
# To allow root login
# be sure to take root out from /etc/ftpusers also :)
#
#RootLogin on
RootLogin off
root 계정으로 로그인, 보안에 좋지 않음 항상off로 해놓을 것

# Normally, we want files to be overwriteable.
<Directory /*>
AllowOverwrite                on
새로운 파일명이 기존의 파일명과 같을 경우 덮어쓰기 허용
</Directory>

# A basic anonymous configuration, no upload directories.
<Anonymous ~ftp>

User                                ftp
Group                                ftp
RequireValidShell off
익명사용자로 접근 가능 설정
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias                        anonymous ftp
anonymous,ftp로 로그인 가능

# Limit the maximum number of anonymous logins
MaxClients                        10
매직 쿠기이용 메세지 삽입가능
("죄송합니다. 현재 사용인원은 %M입니다. 다음을 이용해 주십시요")
최대 접속가능 클라이언트 제한 none으로 설정하면 무제한 접속가능

# Limit the maximum number per host
# MaxClientsPerHost 1
동일한 사용자가 접속을 끊고 제접속할 수 있는 횟수
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.

DisplayLogin                        welcome.msg
로그인시 보여줄 문서 파일 welcome.msg

DisplayFirstChdir                .message

디렉토리 이동시 보여줄 문서 파일 .message
# Limit WRITE everywhere in the anonymous chroot
<Limit WRITE>
DenyAll
</Limit>
익명사용자 쓰기금지 설정
# Upload directory, allow upload and mkdir and deny download
#
# <Directory incoming>
# <Limit READ>
# DenyALL
# </Limit>
# <Limit STOR MKD>
# AllowALL
# </Limit>
# </Directory>
업로드 디렉토리 생성시 다운로드 금지, 업로드 디렉토리
생성 가능 설정
</Anonymous>

자 설정이 끝났으면 데몬을 재실행하자(윈도우에서 프로그램 설치 후 리부팅하는
것을 기억하는가
리눅스에서는 데몬에 관한 내용을 설정 후 데몬을 재 실행 시켜야만 한다.)


3. Proftpd Start/Stop

[root@rootshell /root]# /etc/rc.d/init.d/proftpd stop
shutting down ProFTPD [ok]
[root@rootshell /root]# /etc/rc.d/init.d/proftpd start
starting ProFTPD [ok]

  

 
         4. FTP 사용법

        4-1 리눅스

  • # Ftp 192.168.xxx.xxx
  • Username 입력
  • Password 입력

  

   

   

4-2 윈도우(cmd창)

  • 방화벽으로 인하여 접속이 않될 경우가 있음.(방화벽 해제)

       

  • # Ftp 192.168.xxx.xxx
  • Username 입력
  • Password 입력

  

   

   

   

4-3 FTP 명령어들..

1) ls, dir : ftp의 폴더 목록이나 파일 목록을 보여준다.

2) cd : 해당 폴더의 내부로 들어가기 위해서 cd 폴더명 을통해 폴더를 접근한다.

3) get : 파일을 받는 명령어 이다. get 파일명 을 적어주면 파일을 받을수있다.

4) mget : 파일을 여러개 받는 명령어 이다.

5) put : 파일을 업로드 한다. put 파일명을 적어주면 된다.

6) mput : 파일 여러개를 함께 올리는 명령어 이다.

7) hash : 파일 업/다운 로드의 진행 상황을 보여준다

8) bye or quit : ftp를 끝낸다.

9) help : 명령어의 전체보기

   

   

   

참고자료

원본 위치 <http://blog.iizs.net/6010654 >

원본 위치 <http://www.webtoedu.com/menu2_4.html>

원본 위치 <http://superuser.org/linux/dacker/page04.htm>

원본 위치 <http://cafe.naver.com/ArticleRead.nhn?articleid=909&sc=e0d2361c0e40259b12&query=cmd+ftp+%B8%ED%B7%C9%BE%EE&clubid=16566486>

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,




 윈도우폰 게임개발 기초
 



윈도우폰 개발에 사용되는 함수와 참조하는 클래스들에 대해서 알아보도록 하자.
실제 윈도우폰 게임 개발을 열었을 때 나오게되는 소스에 대해서 분석해보았다. 
 

using System;
using System.Collections.Generic;
using System.Linq;

using Microsoft.Xna.Framework;//XNA 프레임워크 라이브러리(손쉬운 게임개발)

using Microsoft.Xna.Framework.Audio; // XACT로 만든 프로젝트 및 콘텐츠 오디오 파일을 재생하고 낮은 수준의 인터페이스 방식에서 조작할 수 있는 클래스제공

using Microsoft.Xna.Framework.Content;// 게입에서 사용하는 자원들을 각 파일 포맷에 따리 관리하고 유지하는데 필요한 클래스

using Microsoft.Xna.Framework.GamerServices; // xbox LIVE와 관련된 기능을 담당하는 모듈로 LIVE 관린 GUI등이 포함, 
                                             //게이머의 데이터와 직접 통신하거나 게이머의 선택을 반영할 수 있는 API제공

using Microsoft.Xna.Framework.Graphics; // 3D오브젝트를 표시하는 하드웨어 가속 기능과 렌더링을 포함하는 낮은 수준의 응용프로그램 인터페이스를 제공

using Microsoft.Xna.Framework.Input; //xbox360 컨트롤러 장치와 키보드, 마우스의 입력을 받을 수 있는 함수와 클래스를 제공
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media; // 음악과 앨범, 재생목록, 사진 등의 자료 재생 및 접근과 관련된 클래스 제공

using Microsoft.Xna.Framework.Net;  // XNA프레임워크 게임상에서 Xbox Live 멀티 플레이어 지원 및 네트워킹을 구혀하는 클레스 제공

using Microsoft.Xna.Framework.Storage; // 저장장소의 파일을 읽고 쓰는 것을 담당하는 클래스를 제공



namespace WindowsPhoneGame2
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    /// 
    public class Game1 : Microsoft.Xna.Framework.Game // 상속을 받았음.
    {
        GraphicsDeviceManager graphics; //그래픽디바이스매니저
        SpriteBatch spriteBatch; //이미지 출력시 다양한 옵션제공

        //SpriteFont spriteFont;
        //String messagetext = "Hello Windows Phone 7";

        Texture2D texture; //텍스처 
        


        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            // Frame rate is 30 fps by default for Windows Phone. 프래임속도 30프래임
            TargetElapsedTime = TimeSpan.FromTicks(333333);

            graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight | DisplayOrientation.Portrait;
                                               //단말기 왼쪽이 밑변인 가로방향      단말기 오른쪽이 밑변인 가로 방향                   세로방향
            
            graphics.PreferredBackBufferWidth = 350;
            graphics.PreferredBackBufferHeight = 250;

            // Extend battery life under lock. // 잠금에 따라서 배터리 수면연장
            InactiveSleepTime = TimeSpan.FromSeconds(1);
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()  // 게임이 시작되었을 때 초기에 실행되며 기본적인 게임 관련 설정을 수행함. 이니셜라이즈~
        {
            // TODO: Add your initialization logic here

            base.Initialize(); //최상위에 있는 함수의 기능을 사용할떄 base.
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        /// 

        protected override void LoadContent() // 2D이미지 또는 3D 모델, 음원 등의 콘텐츠들을 게임 내에서 사용하기 위한 역할을 수행함.
        {


            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here

            //spriteFont = Content.Load<SpriteFont>("HelloFont");

            texture = new Texture2D(GraphicsDevice, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
                                                                                            //그래픽 디바이스, 그래픽의 너비와 크기 지정
            texture = Content.Load<Texture2D>("exDog");  // 해당 2D 이미지 가져오기
            
            
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        /// 

        protected override void UnloadContent()  // LoadContent 메서드에서 로드한 콘텐츠들을 해제하는 역할을 게임 종료 또는 장치변경시 수행함.
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        /// 

        protected override void Update(GameTime gameTime) //캐릭터의 이동, 전투처리, 키보드, 게임 패드 등의 입력장치 
                                                          //처리등의 게임 로직부분을 처리하는 가장 중요한 부분.
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            base.Update(gameTime);//최상위에 있는 함수의 기능을 사용할떄 base.
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        /// 

        protected override void Draw(GameTime gameTime) // 배경화면, 주인공 등 게임에 표현되는 2D 이미지와 3D모델, 텍스트 등을 화면에 출력하는 기능을 수행.
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            //spriteBatch.Begin(); //일괄적으로 시작
           //spriteBatch.DrawString(spriteFont, messagetext, Vector2.Zero, Color.Black); //폰트적용, 메시지, 위치, 색
            //spriteBatch.End();


            spriteBatch.Begin(); // 출력시작

            spriteBatch.Draw(texture, new Vector2(0,0), Color.Red); //이미지 출력
           

            spriteBatch.End(); //이미지 출력완료

            base.Draw(gameTime); //최상위에 있는 함수의 기능을 사용할떄 base.
        }
    }
}




참고사이트

* MSDN Phone Page - http://msdn.microsoft.com/ko-kr/gg415576

* 서진호의윈도우폰이야기http://blogs.msdn.com/jinhoseo

* Windows Phone Korea –http://www.facebook.com/windowsphonekorea

*Windows Phone Training Kit- http://msdn.microsoft.com/en-us/hh220612 

'1. IT Story > Development' 카테고리의 다른 글

Heap Tree (보기좋게출력)  (0) 2012.03.28
하노이타워  (0) 2012.03.28
이진찾기  (0) 2012.03.28
피보나치  (0) 2012.03.28
C# 채팅 프로그램(Client 확장)  (0) 2012.03.07
C# 채팅 프로그램(Server 확장)  (4) 2012.03.07
C# 채팅 프로그램(Client)  (0) 2012.03.07
선택정렬응용  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


 C# 채팅 프로그램(Client 확장)
 


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace ChatClient
{
    public partial class MainForm : Form
    {
        TcpClient Client;   // 서버+클라이언트기능을 하기위해서
        StreamReader Reader; //스트림 값을 읽어오기 위해서
        StreamWriter Writer; //스트림 값을 쓰기위해서
        NetworkStream stream; //네트워크스트림 연결을 위해서
        Thread ReceiveThread; //멀티쓰레드를 위해서
        bool Connected;  // 연결상태확인

        private delegate void AddTextDelegate(string strText);

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_FormClosing(object sender, FormClosedEventArgs e) //종료버튼을 눌렀을때
        {
            Connected = false;

            if (Reader != null)
                Reader.Close();

            if (Writer != null)
                Writer.Close();

            if (Client != null)
                Client.Close();

            if (ReceiveThread != null)
                ReceiveThread.Abort();
        }

        private void SendBtn_Click(object sender, EventArgs e)
        {
            txtMessage.AppendText("이쪽 " + txtSend.Text + "\r\n"); // 이쪽 : 블라블라~
            Writer.WriteLine(txtSend.Text);  //작성한 글을 읽어서 씀 
            Writer.Flush();                  //전송하고 비움.

            txtSend.Clear(); // 글을 작성하는 부분 클리어
        }

        private void ConnectBtn_Click(object sender, EventArgs e)
        {
            if (txtIP.Text == "") //ip 않적고 눌르면
            {
                MessageBox.Show("서버IP 주소를 입력해 주세요", "", MessageBoxButtons.OK, MessageBoxIcon.Error); //에러 창 뜨게하기
            }1

            try
            {

                String IP = txtIP.Text; // ip쓰는 창에서 IP값 바다오기
                int port = 8080; //포트설정

                Client = new TcpClient();  //클라이언트 생성
                Client.Connect(IP, port);  //클라이언트 서버에 연결

                stream = Client.GetStream(); // 클라이언트의 스트림값 받아오기
                Connected = true; // 서버연결성공시 true
                txtMessage.AppendText("서버와 연결되었습니다" + "\r\n");

                Reader = new StreamReader(stream);  // 스트림값을 읽어드리기
                Writer = new StreamWriter(stream);  // 스트림값을 쓰기

                ReceiveThread = new Thread(new ThreadStart(Receive)); //클래스를 통해서 값을 받는다.
                ReceiveThread.Start(); // 값을 받는 스레드 실행
            }
            catch(Exception ConnE)
            {
                txtMessage.AppendText("서버에 연결할 수 없습니다." + "\r\n");
            }

        }

        private void Receive()
        {
            AddTextDelegate AddText = new AddTextDelegate(txtMessage.AppendText); // 메소드 등록

            try
            {

                while (Connected)
                {
                    Thread.Sleep(1); //Windows 시스템은 거의 정확한 sleep 시간을 보장한다. 즉, 1ms에 거의 유사한 sleep 시간을 제공한다.

                    if (stream.CanRead) // 스트림을 읽을 수 있다면...
                    {
                        string tempStr = Reader.ReadLine(); // 값을 일어와서

                        if (tempStr.Length > 0) // 문자 길이가 0이 아니라면
                        {
                            Invoke(AddText, "저쪽: " + tempStr + "\r\n"); // 출력
                            Panel_1.Text = "메시지도착시간: " + DateTime.Now; // 메시지도착시간 출력

                        }


                    }

                }

            }
            catch (Exception e)
            {

            }

        }

        private void MainForm_Load(object sender, EventArgs e)
        {

        }
    }
}



<완성>



참고자료
 

비주얼 C# 2005 익스프레스로 배우는 C# 2.0 프로그래밍 
MSDN http://msdn.microsoft.com/ko-kr/default.aspx  


'1. IT Story > Development' 카테고리의 다른 글

하노이타워  (0) 2012.03.28
이진찾기  (0) 2012.03.28
피보나치  (0) 2012.03.28
윈도우폰 게임개발 기초(WindowPhoneGame)  (0) 2012.03.07
C# 채팅 프로그램(Server 확장)  (4) 2012.03.07
C# 채팅 프로그램(Client)  (0) 2012.03.07
선택정렬응용  (0) 2012.03.07
이름정렬  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


C# 채팅 프로그램(Server 확장)
 


채팅 서버와 클라이언트를 같이 가지고 있는 프로그램이다.

클라이언트와 서버에서 통신을 하기위해서 해당 IP주소와 포트번호를 일치 시켜주어야 한다.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace ChatServer
{
    public partial class MainForm : Form
    {
        TcpListener Server; // 소켓 서버를 구현하기 위해서
        TcpClient Client;   // 서버+클라이언트기능을 하기위해서

        StreamReader Reader; //스트림 값을 읽어오기 위해서
        StreamWriter Writer; //스트림 값을 쓰기위해서

        NetworkStream stream; //네트워크스트림 연결을 위해서

        Thread ReceiveThread; //멀티쓰레드를 위해서

        bool Connected;  // 연결상태확인

        private delegate void AddTextDelegate(string strText); //Cross-Thread 호출을 실행하기 위해 사용함.

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            Thread ListenThread = new Thread(new ThreadStart(Listen)); //서버를 시작함.
            ListenThread.Start();
        }

        private void SendBtn_Click(object sender, EventArgs e)
        {
            txtMessage.AppendText("이쪽 " + txtSend.Text + "\r\n"); // 이쪽 : 블라블라~
            Writer.WriteLine(txtSend.Text);  //작성한 글을 읽어서 씀 
            Writer.Flush();                  //전송하고 비움.
            txtSend.Clear(); // 글을 작성하는 부분 클리어
        }

        private void MainForm_formClosing(object sender, FormClosedEventArgs e) //종료버튼을 눌렀을때
        {
            Connected = false;

            if (Reader != null)
                Reader.Close();

            if (Writer != null)
                Writer.Close();

            if (Server != null)
                Server.Stop();

            if (Client != null)
                Client.Close();

            if (ReceiveThread != null)
                ReceiveThread.Abort();

        }

        private void Listen()
        {
            AddTextDelegate AddText = new AddTextDelegate(txtMessage.AppendText); // 메소드를 등록

            try {

                IPAddress addr = new IPAddress(0); //ip주소
                int port = 8080; //포트

                Server = new TcpListener(addr, port); //서버에 ip주소와 포트가져와서 서버실행

                Server.Start();  // 서버시작

                Invoke(AddText, "서버가 시작되었습니다..." + "\r\n");

                Client = Server.AcceptTcpClient(); //Client 수락

                Connected = true; // 연결됬음을 알리는..

                Invoke(AddText, "클라이언트와 연결되었습니다." + "\r\n");

                stream = Client.GetStream(); // 스트림을 통해서 Client값을 가져오기

                Reader = new StreamReader(stream);  // 스트림값을 읽어드리기
                Writer = new StreamWriter(stream);  // 스트림값을 쓰기

                ReceiveThread = new Thread(new ThreadStart(Receive)); //클래스를 통해서 값을 받는다.
                ReceiveThread.Start(); // 값을 받는 스레드 실행

            
            }
            catch(Exception e)
            {
            
            }
        }

        private void Receive()
        {
            AddTextDelegate AddText = new AddTextDelegate(txtMessage.AppendText); // 메소드 등록

            try
            {

                while (Connected)
                {
                    Thread.Sleep(1); //Windows 시스템은 거의 정확한 sleep 시간을 보장한다. 즉, 1ms에 거의 유사한 sleep 시간을 제공한다.

                    if (stream.CanRead) // 스트림을 읽을 수 있다면...
                    {
                        string tempStr = Reader.ReadLine(); // 값을 일어와서

                        if (tempStr.Length > 0) // 문자 길이가 0이 아니라면
                        {
                            Invoke(AddText, "저쪽: " + tempStr + "\r\n"); // 출력
                            Panel_1.Text = "메시지도착시간: " + DateTime.Now; // 메시지도착시간 출력

                        }


                    }

                }

            }
            catch (Exception e)
            {

            }

        }
    }
}


참고자료
비주얼 C# 2005 익스프레스로 배우는 C# 2.0 프로그래밍 
MSDN http://msdn.microsoft.com/ko-kr/default.aspx 


'1. IT Story > Development' 카테고리의 다른 글

이진찾기  (0) 2012.03.28
피보나치  (0) 2012.03.28
윈도우폰 게임개발 기초(WindowPhoneGame)  (0) 2012.03.07
C# 채팅 프로그램(Client 확장)  (0) 2012.03.07
C# 채팅 프로그램(Client)  (0) 2012.03.07
선택정렬응용  (0) 2012.03.07
이름정렬  (0) 2012.03.07
링크드리스트를 이용한 학생관리Pro  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


C# 채팅 프로그램 만들기(Client)
 


C#을 이용하여 간단한 채팅프로그램을 만들어 보자.
채팅프로그램을 만드는 것을 통하여 간단한 소켓통신에 대해서 알아보고 활용해 보자.

채팅을 하기 위해서는 서버와 클라이언트가 필요하다. 


using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;


using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Ex_chatClient
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            NetworkStream stream; 
            StreamReader Reader;

            TcpClient Client = new TcpClient();  //클라이언트 생성
            String DestIP= "localhost"; // 연결할 IP주소

            Client.Connect(DestIP, 8080); // IP 주소와 포트, 서버에 연결을 요청

            stream = Client.GetStream(); // NetWorkStream을 생성한 후 서버에서 보낸 데이터를 읽어들임
            
            Reader = new StreamReader(stream); //스트림으로 받아와서 

            string tempStr = Reader.ReadLine(); // 스트림 값을 읽어서

            txtReceive.AppendText(tempStr);  // tetReceive에 출력

            Client.Close(); //클라이언트 종료

        }
    }


참고자료
 

비주얼 C# 2005 익스프레스로 배우는 C# 2.0 프로그래밍 
MSDN http://msdn.microsoft.com/ko-kr/default.aspx 

'1. IT Story > Development' 카테고리의 다른 글

피보나치  (0) 2012.03.28
윈도우폰 게임개발 기초(WindowPhoneGame)  (0) 2012.03.07
C# 채팅 프로그램(Client 확장)  (0) 2012.03.07
C# 채팅 프로그램(Server 확장)  (4) 2012.03.07
선택정렬응용  (0) 2012.03.07
이름정렬  (0) 2012.03.07
링크드리스트를 이용한 학생관리Pro  (0) 2012.03.07
링크드리스트(Linked list)  (0) 2012.03.07
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

선택정렬응용

 

 

 


#include <iostream>
#include <iomanip>  // 전처리기  setw() 필드 폭 설정

using namespace std;

void sel(int *a , int b);   //선택정렬

void print(int *a , int  b);    //출력

int main()

{
    int size;

 cout << "몇 개를 입력 할까요??"<< endl;  // 사이즈 입력
    cin >> size;


 int *A= new int[size];    // 사이즈 만큼 메모리 할당

 cout << setw(6)<<"임의로 받은 수" <<endl;  
 for(int x=0; x<size; x++)
    {
    A[x]=rand()%100;                 // 1~100사이의 임의의 수를 넣는다.
    cout <<setw(6)<< A[x];
    }
     cout <<endl;

 int len= size;      // 임의의 배열 크기 측정
   
 sel(A , len);   // 선택 정렬  <배열앞에 &을 붙이지 않아도 됨.>
                    //         <왜냐하면 배열의 이름은 첫번째 주소의 주소값을 나타내기 때문임.>
 print(A , len);    //출력     <배열 전달 시 포인터 나 배열로 받아야함!!>
  
    delete [] A;   // 메모리 해제
}

 

void sel(int *a , int b)
{

  for(int i =1; i <=b-1; i++)
  {

 int hold = a[i];
    int walker = i-1;

 while(walker >= 0 && hold< a[walker])
 {
  
    a[walker+1]=a[walker];
    walker=walker-1;
    cout << endl;
   
 }
 a[walker +1] = hold;
    cout << endl;
 

          for(int k=0; k<b; k++)
    {
   
      if(hold==a[k])
   {
    cout << setw(6)<< "<" ;
   }
   else if(hold== a[k])              //변화 단계 출력
   {
    cout << setw(6)<< "[";
   }
   cout << setw(6)<< a[k];
   if(hold== a[k])
    cout << setw(6) <<">";
   else if(hold == a[k])
   {
    cout << setw(6)<<"]";
   }
    

    }
   
  }  
}

void print(int *a, int  b)
{
 cout << endl;
 cout << "정렬완료"<< endl;
 for(int i=0; i<b; i++)        // 배열의 크기만큼 루프를 돌려 a[i]출력.
 {
 
  cout<< setw(6)<<a[i];  // 6만큼 필드 폭을 설정하여 a[i]출력.
     
 }
 cout << endl;

}

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


 

이름정렬

 

 

strcmp 의 기능중에 문자의 순서를 검사 해주는 기능이 있다.

 

>0  일때          앞에 있는 것이 큰지

==0 일때         같음을 알려주고

<0 일때           뒤에 있는 것이 큰지

 

#include<iostream>
#include<string>
using namespace std;

void sort_name(char(*name)[20]);
void inpt_name(char(*name)[20]);
void prnt_name(char(*name)[20]);

int main()
{
 

 char name[10][20];

 

 inpt_name(name);
 cout <<"\n===정렬전 데이터===\n"<<endl;
 prnt_name(name);
 sort_name(name);
 cout <<  "\n===정렬후 데이터===\n"<<endl;
 prnt_name(name);

 return 0;
}

void inpt_name(char(*name)[20])
{
 int i;
 for(i=0;i<5;i++)
 {
  cout<< i+1 <<"번째 이름을 입력하시오 :"<< endl;
  cin>>name[i];
 }
}


void sort_name(char(*name)[20])
{
 int i, k;
 char temp[20];

 for(k=0;k<5;k++)
 {
  for(i=k+1;i<5;i++)
  {
   if(strcmp(name[k],name[i])>0)
   {
    strcpy(temp,name[k]);
    strcpy(name[k],name[i]);
    strcpy(name[i],temp);
   }
  }
 }
}


 void prnt_name(char(*name)[20])
{
 int i;
 for(i=0 ;i<5 ;i++)
 {
   cout << name[i] << endl;
 }


}


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

 

링크드리스트를 이용한 학생관리Pro

 

 

 

#include <iostream>
#include <iomanip>
#include <cstring>   // 문자 비교함수 이용.

using namespace std;


struct student
{
  char name[20]; // 이름
  char s;   // 성별
  int y;   //연령
  char c[20];  //출생지

  student *p;
};

student *p1;

enum menu {add_student, del_student, n_student, s_student, c_student, show_all, quit};
//메뉴 -   학생추가, 선택삭제 및 중복 삭제, 이름검색,  성비검색,  출생지 명수, 전체보기, 나가기

menu showMenu();

//bool Mystrcmp(char x[], char y[]);                      // 문자 비교함수 제외 하고 제공해주는 strcmp(a,b)==0 문자 비교함수 이용

bool addStudent(student *sp, int maxsize, int &num);    // 학생 추가함수
bool delStudent(student *sp, int maxsize, int &num);    // 삭제 함수
void namechcak(student *sp, int num);                   // 이름 중복 체크 함수
void c_chcak(student *sp, int num);                     // 도시 중복 체크 함수
void n1_student(student *sp, int num);                  // 이름 검색함수
void s1_student(student *sp, int num);                  // 성비 검색함수
void c1_student(student *sp, int num);                  // 출생지 명수보기함수
void showall(student *sp, int num);                     // 전체 출력함수

int main()
{
   int size=0;
 
 cout << " 몇 명의 사람을 입력하겠습니까??" << endl;
    cin>> size;                         //동적 메모리 할당 크기 지정

    student *slist= new student[size];  //동적 메모리 할당

    int numofstudents = 0;              //입력받은 학생수

 bool flag = false;                  //종료시 사용되는 flag

 menu select;                      

 while(true)
 {
   select = showMenu();              //메뉴함수 콜

   switch(select)
   {
   case add_student :    
    { 
     bool success;            
   
     success= addStudent(slist, size, numofstudents);  //타입이 bool addStudent()인 함수 출력

              namechcak(slist,  numofstudents);                 //함수 중복 체크
     c_chcak(slist,  numofstudents);                   //함수 중복 체크
 

    break;

    }
 case  del_student :                                        //선택 삭제 및 중복 삭제
    { 
     bool success1;
   
     success1 = delStudent(slist, size, numofstudents);

    break;

    }
      case n_student :
    { 
    n1_student(slist, numofstudents);                 //타입이 void인 함수 출력
    break;
    }


      case s_student :
    { 
     s1_student(slist, numofstudents);                //타입이 void인 함수 출력

    break;
    }
      case c_student :
    { 
     c1_student(slist, numofstudents);                //타입이 void인 함수 출력

    break;
    }

   case  show_all :
    {
            showall(slist, numofstudents);                     //타입이 void인 함수 출력

    break;
    }
   case quit :
    {
     flag=true;
    break;
    }
   default :

    cout << "올바르지 않은 입력입니다." << endl;
    break;
   }//switch 끝

   if(flag==true)
   { 
    break;
   }
 }//while 끝

   delete [] slist;     //동적 할당 해제

  return 0;

}
 
menu showMenu()
{
  menu ret;

  bool flag = false;

while(true)
 {
   cout << endl;
      cout << "--------메뉴--------"<<endl;
      cout << "1.입력"  <<endl;
   cout << "2.선택 삭제"  <<endl;
      cout << "3.이름으로 검색" <<endl;
      cout << "4.성비 검색" <<endl;
      cout << "5.출생지 명수보기" <<endl;
      cout << "6.전체 표시" << endl;
      cout << "Q.프로그램 종료(q/Q)" <<endl;
      cout << "원하는 작업의 번호를 입력하세요: ";
   cout << endl;
 
   char select;
   cin>> select;
 

   switch(select)
   {
   case '1' :
    { 
     ret = add_student;
              flag = true;
    break;
    }
   case '2' :
    { 
     ret = del_student;
              flag = true;
    break;
    }
      case '3' :
    { 
     ret = n_student;
      flag = true;
    break;
    }


       case '4' :
    { 
     ret =s_student;
      flag = true;
    break;
    }
       case '5' :
    { 
     ret =c_student;
      flag = true;
    break;
    }

   case  '6' :
    {
             ret = show_all;
    flag = true;
    break;
    }
   case 'q' :
   case 'Q' :
    {
     ret = quit;
     flag = true;
    break;
    }

   default :
    cout << "올바르지 않은 입력입니다." << endl;
    break;
   }
  
   if(flag==true)
   {
    break;
   }
  
   }

  return ret;
 
}

//
// bool Mystrcmp(char x[], char y[]) // 문자열 비교함수(전지훈 선배의 조언!)
//
//{
// int a, b;
//
// bool ret;
//
// for(a=0; x[a] != '\0'; a++);  // 널이 아닐때까지 루프 돌기
//
// for(b=0; y[b] != '\0'; b++);  // 널이 아닐때까지 루프 돌기
//
// if( a < b)        
// {
//  for(int k = 0 ; k <= b; k++)
//
//  {
//   if(x[k] != y[k])       // 같지 않을 때
//   {
//    ret = false;
//    return ret;
//   }
//  }
//  ret = true;
//  return ret;
// }
// else
// {
//  for(int k = 0 ; k <= a; k++)
//  {
//   if(x[k] != y[k])       // 같지 않을 때
//   {
//    ret = false;
//   return ret;
//   }
//  }
//  ret = true;
//  return ret;
// }
//}

void namechcak(student *sp, int num)
{
  for(int i=0; i<num; i++)
 {
 
     if(strcmp((sp+i+1)->name, (sp+i)->name)==0)   //// 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
  {
   cout << "이름이 중복 데이터는 다음과 같습니다." <<endl;   // 0 이라면 출력
      cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;   // 0 이라면 출력
            cout << endl; 
  }
 }
 
}

void c_chcak(student *sp, int num)
{
  for(int i=0; i<num; i++)
 {
     if(strcmp((sp+i+1)->c, (sp+i)->c)==0)     // 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
  {
   cout << "도시가 중복 데이터는 다음과 같습니다." <<endl;      // 0 이라면 출력
   cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;   // 0 이라면 출력
            cout << endl;  
  }
 }
 
}

 

bool addStudent(student *sp, int maxsize, int &num)
{
  bool ret;


 if(num >= maxsize)         // 할당된 크기보다 num이 클경우
 {
  cout << maxsize << "명까지의 성적만 받습니다."<<endl;
 ret = false;
 }

 else
 {
     //포인터를 이용하되 포인터 값의 변경없이 입력받기 (화살표사용)


  cout << num << "번 학생의"<< endl;

  cout <<"-----1. 이름 입력-----"<<endl;
     cin >> (sp+num)->name;

  cout << "-----2. 성별(남(m,M)/여(F,f))입력-----"<<endl;
  cin >> (sp+num)->s;

  cout <<"-----3. 나이 입력-----" <<endl;
  cin >> (sp+num)->y;

  cout <<"-----4. 출생지 입력-----"<<endl;
  cin >> (sp+num)->c;
 

  num++;

     ret = true;
 }
 
 return ret;
}


bool delStudent(student *sp, int maxsize, int &num)   //선택삭제 및 중복 삭제
{
  bool ret;
  char name[20];
  student temp;

  cout << "삭제하고 싶은 사람의 이름 : ";
 cin>> name;
  

 for(int i=0;i< maxsize;i++)                      
 {
  if(strcmp(name, (sp+i)->name)==0)              //// 입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
  {
   for(int k=i;k<num;k++)
   {
    temp = sp[i];       //삭제할 내용을 temp로 빼고 그 뒤에 있는 내용을 앞으로 올림.
 sp[i] =sp[i+1]; 
   }
    cout << "삭제 되었습니다."<<endl;

    num--;             //올라온 뒷자리를 없어지게 함.
  }
 
 }
 
     ret = true;

   return ret;
}

void n1_student(student *sp,int num)
{
 char name[20];

 cout << "찾고자 하는 이름 : ";
 cin>> name;
   
   
 for(int i=0; i<num; i++)
 {
 

  if(strcmp(name, (sp+i)->name)==0)    //  입력 받은 내용을 strcmp(a,b)==0를 이용하여 문자 비교
  {

   cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl; // 0 이라면 출력
  }
 
 
 
 }


}


void s1_student(student *sp,int num)
{
 
 float f=0;
 float m=0;
 float tf=0.00;
 float tm=0.00;

for(int i=0; i<num; i++)
{
 if(sp[i].s=='f' || sp[i].s=='F')    // f또는 F 일때
  {
   f++;   // 중복 수만큼 증가
          //cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;
  }
 if(sp[i].s=='m' || sp[i].s=='M')     // m또는 M 일때
  {
   m++;   // 중복 수만큼 증가
          //cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;
  }

}

 tf=(f/(f+m))*100;    //여자비율
 tm=(m/(m+f))*100;    //남자 비율


 cout << "여성 : 남성 "<< tf <<':'<< tm <<endl;

}

void c1_student(student *sp,int num)
{
  char cs[20];
  int count=0;

  cout << "찾고자 하는 출생지는?? : ";
  cin>> cs;
 
 for(int i=0; i<num; i++)
 {
   
  if(strcmp(cs, (sp+i)->c)==0)   
  {
   count++;  //중복 수 만큼 증가
    
         // cout << (sp+i)->name << setw(5) << (sp+i)->s << setw(5) << (sp+i)->y << setw(5) <<(sp+i)->c <<endl;
  }
 }
  cout << "도시,"<< cs <<"의 거주자 수 :" << count <<endl;
}

void showall(student *sp, int num)
{
 cout.precision(2);
 cout << fixed;
 cout <<setw(5) <<" ________전체 표시_______"<<endl;
    cout <<setw(5) <<" 번호 이름 성별 연령 출생지"<<endl;

 for(int i=0; i< num; i++)
 {
  //포인터의 증가를 이용하여 입력받기
  cout <<setw(5) <<i+1 << setw(5) << sp->name << setw(5) << sp->s << setw(5) << sp->y << setw(5) << sp->c <<endl;
  sp++;
 
 }
 cout <<setw(5) <<" _________________________"<<endl;
}

 

 


 

'1. IT Story > Development' 카테고리의 다른 글

C# 채팅 프로그램(Server 확장)  (4) 2012.03.07
C# 채팅 프로그램(Client)  (0) 2012.03.07
선택정렬응용  (0) 2012.03.07
이름정렬  (0) 2012.03.07
링크드리스트(Linked list)  (0) 2012.03.07
이진탐색+Recrusion (되부름 알고리즘)  (0) 2012.03.07
C# 채팅 프로그램(Server)  (2) 2012.03.06
Update Instructions - Mango Beta 2 for WPDevs - 2.0  (0) 2011.08.22
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,