<Client>

 

5. Server 연결. (Server에 전화 걸기.)

 · SOCKADDR_IN 구조체 선언. (주소 패밀리와 IP, 포트 번호를 쉽게 참조할 수 있도록 만들어진 구조체)

 · connect 함수 호출. (Server에 접속 요청)

 

  - SOCKADDR_IN 구조체

   sin_family : 프로토콜 체계를 정의한다. (인터넷 기반 [IPv4]의 경우는 AF_INET)

   sin_addr : Server의 IP 주소 정보를 넣어준다.

   sin_port : Server의 Port 정보를 넣어준다.

 

  - connect 함수

   Parameter 1 : 미리 생성한 socket을 넣어준다.

   Parameter 2, 3 : 미리 생성한 SOCKADDR_IN 구조체 정보를 넣어준다.

 

   Return : 정상적으로 연결되지 않을 경우 SOCKET_ERROR 값을 반환한다. (winsock2.h에 상수값으로 정의되어 있음.)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
    SOCKADDR_IN ServerInfo;
 
    ServerInfo.sin_family = AF_INET;
    ServerInfo.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    ServerInfo.sin_port = htons(2011);
    
    int Result = connect(m_Socket, (SOCKADDR*)&ServerInfo, sizeof(ServerInfo));
    if(Result == SOCKET_ERROR)
    {
        closesocket(m_Socket);
        WSACleanup();
        return false;
    }
cs

 

6-1. Data 송신 (Server에게 말하기)

 · send 함수 호출. (Block 함수이므로 해당 일이 끝날때까지 리턴되지 않고 대기한다.)

 

  - send 함수

   Parameter 1 : 미리 생성한 socket을 넣어준다.

   Parameter 2 : 보낼 Data를 넣어준다. (char형의 포인트이므로 구조체던지 int형이던지 적절한 캐스팅 연산자를 사용해 어떤 데이터든지 보낼 수 있다.)

   Parameter 3 : Parameter 2의 크기.

   Parameter 4 : 함수 호출 시에 여러가지 옵션을 설정할 수 있다. (특별한 옵션을 주지 않으면 0을 넣어준다.)

 

   Return : 정상 송신 시 데이터를 보낸 양만큼의 Byte 크기를 반환 / 에러 발생 시 SOCKET_ERROR를 반환.

 

6-2. Data 수신 (Server의 말 듣기)

 · recv 함수 호출. (Block 함수이므로 해당 일이 끝날때까지 리턴되지 않고 대기한다.)

 

  - recv 함수

   Parameter 1 : 미리 생성한 socket을 넣어준다.

   Parameter 2 : Data를 담을 Bufer를 넣어준다. 
                     (char형의 포인트이므로 구조체던지 int형이던지 적절한 캐스팅 연산자를 사용해 어떤 데이터든지 받을 수 있다.)

   Parameter 3 : Server로부터 받을 Data의 크기를 모르기 때문에 넉넉히 잡아주는 것이 좋다.

   Parameter 4 : 함수 호출 시에 여러가지 옵션을 설정할 수 있다. (특별한 옵션을 주지 않으면 0을 넣어준다.)

 

   Return : 정상 수신 시 받은 데이터 양만큼의 Byte 크기를 반환 / 에러 발생 시 SOCKET_ERROR를 반환.

 

* Block 함수 주의점 (send, recv, accept 함수)

  Server 측에서 어떤 Client에게 데이터를 전행할 때, Client 측에서 recv함수로 Server가 보낸 Data를 받지 않는다면 대기 상태로 들어가게 된다.

  send, recv 함수는 해당 동작이 끝날때까지 리턴되지 않고 대기하는 Block 함수이기 때문이다.

  Block 함수를 사용할 때는 Server & Client 프로그램 간의 실행구조를 잘 생각해야 한다.

 

 

 

'Programming > Socket' 카테고리의 다른 글

[API] 소켓 통신 2 <Server/Client 공통>  (0) 2017.05.22
[API] 소켓 통신 1 <Server/Client 흐름도>  (0) 2017.05.22

- API SOCKET 사용하기.

 

C++에서 소켓 통신을 하기 위해서 API에서 제공하는 SOCKET을 이용하면 된다.

 

<Server / Client 공통>

 

 1. Header File 추가 & Lib 연결.

  · winsock2.h Header File Include.

  · ws2_32.lib Library 링크.

   (프로젝트마다 링크를 시켜줘야 하는 불편함이 있기 때문에 하기와 같이 프로그램으로 선언해두면 자동으로 링크가 된다.)

 

1
2
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
cs

 

 2. Socket 변수 선언

  · SOCKET형 변수.

  · WSDATA형 변수. 

 

1
2
SOCKET m_Socket;
WSADATA m_wsaData;
cs

 

3. ws2_32.lib 초기화.

  · WSAStartup 함수 호출. (Window Socket을 사용하겠다고 System에 알려주는 함수)

  · WSAStartup 함수는 ws2_32.lib를 초기화 해주어 Window Socket을 사용할 수 있도록 해준다.

  · WSAStartup 함수를 호출해야 Winsock 관련 함수를 사용할 수 있다.

  · Winsock 종료 시에는 반드시 WSACleanup() 을 호출해야만 한다.

 

  - WSAStartup 함수.

  Parameter 1 : 사용할 소켓의 버전이 2.2라는 것을 알려준다.

  Parameter 2 : WSDATA 구조체 변수의 주소값을 넘겨주면 해당 변수에 초기화된 라이브러리 정보가 채워진다.

 

  Return : 정상적으로 초기화가 되면 0 값을 반환.

 

1
2
3
4
5
6
    if(WSAStartup(MAKEWORD(2,2), &m_wsaData) == INVALID_SOCKET)
    {
        printf("WSAStartup() failed : %d", WSAGetLastError());
        WSACleanup();
        return false;
    }
cs

 

4. Socket 생성. (전화기 장만)

  · Socket을 만들어주는 함수.

 

  - socket 함수.

  Parameter 1 : 주소 패밀리(Address Family)를 적어준다. (Internet Protocol 4 (IPv4)를 사용한다면 AF_INET)

  Parameter 2 : 소켓 타입을 적어준다. (SOCK_STREAM : TCP 방식 / SOCK_DGRAM : UDP 방식)

  Parameter 3 : Protocol (0 값을 넣어주면 그에 맞는 Protocol을 사용하도록 한다.)

 

  Return : 성공적으로 Socket이 만들어지면 SOCKET형 데이터를 반환. / 실패 시 INVALID_SOCKET 반환.

 

1
2
3
4
5
6
    m_Socket = socket(AF_INET, SOCK_STREAM, 0);
    if(m_Socket == INVALID_SOCKET)
    {
        printf("socket() failed : %d", WSAGetLastError());
        return false;
    }
cs

 

'Programming > Socket' 카테고리의 다른 글

[API] 소켓 통신 4 <Client>  (0) 2017.05.22
[API] 소켓 통신 1 <Server/Client 흐름도>  (0) 2017.05.22

- SOCKET 이란?

 

두 프로그램이 네트워크를 통해 서로 통신을 수행 할 수 있도록 양쪽에 생성되는 링크의 단자.

두 소켓이 연결되면 서로 다른 프로세스끼리 데이터를 전달 할 수 있다.

 

- Server / Client 흐름도.

 

Server/Client는 전화기에 비율할 수 있다.

 

Server : 전화를 받는 사람.

Client : 전화를 거는 사람.

 

Server는 먼저 실행중인 상태여야 하고 Client의 접속을 허락하고 관리할 수 있어야 한다.

즉, Server는 Client에게 전화가 올 때까지 기다리고 있다가 Client가 전화를 걸면 전화를 받는다.

 

<Server>

 

 1. 전화기가 장만한다. (socket 함수)

 2. 전화 번호를 할당 받아야 한다. (bind 함수)

 3. 전화가 걸려올 수 있도록 전화기를 잭에 연결한다. (listen 함수)

 4. Client로부터 전화가 걸려오면 받는다. (accept 함수)

 5. Client와 대화를 주고 받는다. (send, recv 함수)

 6. 대화가 끝나면 전화를 끊는다. (closesocket 함수)

 

<Client>

 

 1. 전화기가 장만한다. (socket 함수)

 2. Server에 전화를 건다. (connect 함수)

 3. Server와 대화를 주고 받는다. (send, recv 함수)

 4. 대화가 끝나면 전화를 끊는다. (closesocket 함수)

 

참고 내용.

 http://cafe.naver.com/nevernding

'Programming > Socket' 카테고리의 다른 글

[API] 소켓 통신 4 <Client>  (0) 2017.05.22
[API] 소켓 통신 2 <Server/Client 공통>  (0) 2017.05.22

+ Recent posts