비베 네트워크 프로그래밍 윈속(VB Network Programming Winsock) 관련 코딩한것

<비베 네트워크 프로그래밍 윈속(VB Network Programming Winsock) 관련 코딩한것>

 

고수들은 웃겠지만 지나가주시기 바란다. 혹시나 나보다 초보가 있을까봐 올렸다.

초보일수록 초보끼리 도와야하고, 나도 이런 게시글에 덕본적 많으니까.

 

 

이거 정석은 아니다. 일단 내가 정석이 뭔지를 모르기에, 혼자 생각해서 짜본 것이다.

내 자작게임 선비전에 쓰였던 방식을 좀 수정한 것인데 원리 몇가지를 여기 적어두겠다.

 

1. 한계점 : 속도문제, 실시간 온라인 게임은 못 만든다

2. 유용성 : 턴제 게임, 채팅프로그램 완성에 유용

 

 

 

1. 구조

 

서버 1명이 있고, 클라이언트는 7명까지 접속한다.

서버 측 인터넷 연결이 끊기거나 프로그램을 끄면, 네트워크 연결도 끝이다.

 

서버가 끊기면 다른 클라이언트가 서버를 바통터치! 하는 방식도 있지만 어려우니까 생략한다.

 

 

2. 데이터 전송

 

데이터 처리는 생각하지 말고 데이터 전송만 생각하자.

두가지로 나뉜다.

 

– 서버는 클라이언트 전체에게 데이터를 뿌린다.(물론 연결되어있는 클라이언트만)

– 클라이언트는 서버에게 데이터를 보낸다.

 

 

3. 데이터 처리 (어려우면 안 읽어도됨)

데이터 처리까지 생각해보자. 어려운 말 같은데 엄청쉽다.

예를 들어서 온라인게임이라 쳐보자. 서버가 대화창을 열어 “안녕하세요”라고 치고 Enter를 누른다.

그렇다면?

 

* 서버가 데이터를 보내는 과정

1. 서버내 데이터 처리

2. 서버 -> 클라이언트로 데이터 전송

3. 클라이언트는 전송받은것 처리

 

예를 적용해서 쓰면 이렇다,

1. 서버측 게임화면에 “서버님의 말 : 안녕하세요”가 뜸

2. 서버가 클라이언트에게 서버가 안녕하세요 썼다고 보냄 (ex : ‘/MSG, 서버, 안녕하세요’를 전송)

3. 클라이언트 게임화면에서 “서버님의 말 : 안녕하세요”가 뜸

 

그럼 클라이언트가 데이터를 보내면 어떨까?

 

* 클라이언트가 데이터를 (서버에게) 보내는 과정

1. 클라이언트 -> 서버로 데이터 전송

2. 서버는 전송받은것 처리

3. 서버 -> 모든 클라이언트에게 데이터 전송

4. 클라이언트는 전송받은것 처리

 

여기서 클라이언트는 서버가 값을 돌려줄 때까지 데이터 처리를 못한다.

데이터 처리는 화면에 뭐 띄우거나 이런걸 말한다.

그러면 예를 들어 연결이 끊기면 대화창 열어서 말을 해도 화면에 안나온다.

 

 

4. 본 소스에 대한 설명

본 소스에서는 위의 2번, 3번의 내용을 토대로 코딩하였다.

 

기존의 인터넷에서 돌아다니는 비베 윈속공부 소스들은 그 원리를 배우기에는 좋게 되어있지만

실제 응용하기는 번거롭게 되어있는데, 이 점에 주목하여 바로 실전에 쓸 수 있게 만들었다.

 

우선,

 

(1) 본 코드에서 @@@@@@@@@@@@@@@@@@@@… 골뱅이가 반복되는 주석의

아래부분은 이해하지 못해도 좋다.

코딩실력이 부족한 관계로 더럽게 적어놔서 아마 이해를 못할것이다.

깔끔하게 적고 싶었으나…

 

(2) 타이머 두 개가 있어서, 1개는 전송 타이머, 1개는 처리 타이머이다.

사용자가 보내는 데이터는 버퍼(100개 변수공간)에 저장되고, 전송 타이머가 일정시간마다

데이터를 보내서 손실이 없도록 하였다.

처리 타이머도 마찬가지인데 상대로부터 받은 데이터 역시 100개 겟버퍼에 저장되고,

일정시간마다 처리된다.

 

(3) 데이터 전송하는 법

Call SendString(“보내고 싶은말”) 이런식으로 쓰면 된다.

그러면 상대방에게 “[보내고 싶은말]” 이렇게 데이터가 전송되고 만약 50자 이상으로 긴 경우에는

“[보내고” “싶은말]” 이런식으로 가서 합쳐진다. (너무 길면 안된다.. 3분할은 지원안함)

 

주의점으로 “[“, “]” 는 보내지 못하게 막는게 좋다.

 

(4) 데이터 처리하는 법 (DealData 함수)

현재는 채팅프로그램 형태라서 아래와 같이 되어있다.

Function DealData(DString)

Text1.Text = Text1.Text & DString

End Function

 

이것을 수정하는 예로 간단한 게임을 만든다고하면,

서버나 클라이언트에서 SendString(“/이동,주인공,3,21”) 이렇게 보내고,

 

DealData(DString) 부분에

If Left(DString, 3) = “/이동” Then
‘주인공 이동처리
End If
처럼 수정하면 된다.

 

(5) 한계점 : 속도 및 실시간처리 문제

정확한 실험은 안해봤는데 살짝의 시간차 문제가 있을것이다.

 

BitBlt나 윈도우 DirectX 프로그래밍 하에서 실시간게임보다는 턴제 게임을 추천한다.

(지금도 혹시 실시간 가능하려나?) 속도문제는 개선이 필요할듯.

개선되시면 공유해요 우리.

 

 

6. 게임 제작

 

이제 이 소스를 응용해서 네트워크 게임을 만드시면 된다.

 

골뱅이 아래부분은 건드리지말고, 윗부분만 수정해서 만들면 되는데,

서버/클라이언트 따로 생각하지말고 그냥 SendString 하면 알아서 방안의 인원들에게 전송되고,

처리부분도 공통적으로 작성하면 된다.

 

이게 별거 아니라고 생각하겠지만…

개인적으로 선비전은 이거보다 못한 상태에서 만들어서 지금도 버그가 발생한다.

그리고 나같은 프로그래밍 바보들은 이런거 하나 구축하는데도 꽤나 시간이 걸린다는걸 안다.

 

아무도 안쓰면 다음에 나 혼자 써야겠다… 에휴~

 

(공유/수정/무단배포 가능)

비베 네트워크 보드게임 : 선비전 (Source)

망한 게임 선비전. 남부끄러워서 안올리려 했건만 올리는 이유는 다음과 같다.

 

내가 과거에 코딩했던 저작물들을 군대가기 전에 싸그리 지웠었는데,

지금와서 땅을 치고 후회하고 있다.

나같이 기초도 없고 프로그래밍도 모르는 바보는 예전에 만든게 그야말로 보물이다.

여기저기서 훔쳐온 것들 합친 것이고, 두고두고 참고할 수 있기 때문이다.

‘나중에 필요하면 어디선가 구할 수 있겠지’ 했지만 구할 수 없다.

 

본 소스 안에는 Bitblt 사용과 함께, 네트워크 전송(Winsock)에 관련한 코딩결과가 들어있다.

이래뵈도 8인까지 네트워크 플레이를 할 수 있게 되어있고, 실시간 네트워크 게임은 아니더라도

턴제 네트워크 게임 제작에는 도움이 될만한 소스이다.

 

그러나 이런 복잡하고 불친절하게 길이만 긴 코드를 읽어봤자 소용도 없을 것이기에,

(솔직히 내가 지금 읽어도 자신이 없다)

네트워크 전송 부분만 따로 떼어 강의 게시글을 올리도록 하겠다.

 

참고로 게임은 쓰레기이다, 진짜. 재미를 기대하지마라(분명히 말했다)

 

<제작과정>

<2월 4월>

 

<2월 11월>

 

<2월 18월>

 

 

<2월 20일>

 

<3월 최종>

흑곰의 유익한 블로그 2호점 오픈안내

 

 

안녕하세요. 흑곰의 유익한 블로그 2호점입니다.

흑곰의 유익한 블로그 1호점(본점) : http://blog.naver.com/bb_
흑곰의 유익한 블로그 2호점 : http://it-archives.com/

방문해주셔서 감사합니다.

※ 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음.