티스토리 뷰


이번에는 클라이언트 프로그램을 만들어 보려할 것이다. 클라이언트 프로그래밍은 자기 자신만 신경쓰면 되기 때문에 서버 프로그래밍보다 간단하다.


우선 프로젝트를 생성해주자. 그리고 아래의 그림처럼 리스트 박스와 edit box, 버튼을 추가해 주자.























각각의 도구상자의 속성을 수정해 주면 된다.


리스트 박스를 클릭한 후에 변수 추가를 눌러 변수를 추가해 주자.



변수의 이름은 m_event_list로 해주면 된다.





stdafx.h 파일에 위의 코드를 추가해 주면 된다.



그리고 .cpp 파일로 가서 위의 그림과 같이 제거할 것과 추가할 것을 넣어주면 된다.



Dlg.h 파일로 가서 위의 그림과 같이 추가해 주자.

위의 그림에서 mh_socket을 INVALID_SOCKET으로 초기화 해주었다. 이것의 의미는 -1으로 아직 정의되지 않는 소켓을 의미한다. 하지만 소켓은 unsigned값을 가지기에 실제값은 0xFFFFFFFF을 의미한다.


클라이언트는 서버와 다르게 서버에 연결을 위해 connect 함수를 사용한다. 이 함수의 문제는 연결이 되었을 때, 서버가 접속 가능한 상태면 바로 받아 주지만, 정상이 아닌 경우, 프로그램이 최대 28초간 응답없음 상태에 빠질 수 있다. 그래서, 여기서 비동기를 걸어줘야 한다.




비동기를 하면 접속을 성공하든, 실패를 하든 무조건 26001 메시지를 발생한다. 비동기를 안하고 connect를 사용해 성공하면 바로 뜨고, 실패하면 최대 28초간 응답없음이 발생한다.


클래스 마법사에서 사용자 지정 메시지 추가를 통해 26001 메시지를 추가해주자.


 

위의 코드처럼 처리하면 접속이 성공하든 실패하든 이 함수로 접속하게 된다. 그리고 lParam이 두가지 정보가 들어오는데, 어떤 메시지인지, 에러가 있는지 여부이다.

그리고 만약 서버가 존재시 서버가 있다는 것이 클라이언트 프로그램의 리스트 박스에 나오게되고, 26002메시지가 발생하게 된다.

이 메시지는 클라이언트가 현재 데이터를 읽고 있는지, 아니면 서버간에 접속을 끊었는지에 대한 메시지이다.



이제 데이터를 읽고 있을때를 처리해주자. 서버와 마찬가지로 비동기를 사용하여, 소켓 매니저에게 읽어들이는 것은 상관하지 않고, 서버와의 연결이 끊어졌을 때, 메시지를 발생시켜 달라고 요청한다.

그리고 우리가 서버 프로그래밍을 할 때, 소켓에 대해서 우리가 디자인한 방식에 맞추어 코드를 작성해주면 된다. 

FD_READ 부분은 서버 프로그래밍과 비슷하다.

 


이제 버튼 부분에 대해서 프로그래밍을 할 것이다.




우리가 전송할 데이터를 str에 저장하고, 이 변수의 크기를 저장한다. 이때, 마지막 null 문자를 포함하고 유니코드는 문자 하나의 크기가 2바이트이기에 * 2를 해주었다.

그리고 데이터를 전송시 새로운 변수에 우리가 보내려고 하는 문자열의 크기와 헤더의 크기 즉 식별자 1바이트와 message_id 1바이트와 body의 크기 2바이트 총 4바이트를 추가해준다.


첫번째 1 바이트에 식별자를 두번째 1 바이트에 messga_id를 그 다음 2 바이트에 우리가 보내려는 문자열의 크기를 넣어주고, 4바이트 뒤에는 우리가 보내려는 문자열을 복사해주면 된다.

마지막으로 send 함수를 사용하여 서버로 보내주면 된다. 생성자를 사용했기에 제거도 해줘야 한다.


서버와 클라이언트를 동시에 실행해보자.



위와 같은 결과가 나오게 된다. 그리고 클라이언트에서 서버로 문자를 전송하게 되면,



서버로 문자가 가게되는 것을 확인할 수 있다.




댓글