3.3 TCP 에코 클라이언트 구현 [TCP/IP 소켓 프로그래밍 with 윈도우즈]

이번에는 TCP 에코 클라이언트를 구현합시다.

먼저 약속한 포트 번호와 서버 주소 및 메시지 크기를 정의합니다. 서버 IP 주소는 여러분께서 수정하세요.

#define PORT_NUM    10200
#define MAX_MSG_LEN 256
#define SERVER_IP   "192.168.34.50" //서버 IP 주소

클라이언트 측도 윈속 초기화부터 시작합니다.

int main()
{
    WSADATA wsadata;
    WSAStartup(MAKEWORD(2,2),&wsadata);//윈속 초기화

소켓을 생성합니다.

    SOCKET sock;
    sock = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);//소켓 생성
    if(sock == -1)
    {
        return -1;
    }

서버의 소켓 주소를 설정하여 연결을 요청합니다. 클라이언트에서는 로컬 네트워크 인터페이스와 결합하는 과정은 선택 사항입니다. 여기에서는 생략합시다.

    SOCKADDR_IN servaddr={0};//소켓 주소
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr(SERVER_IP);
    servaddr.sin_port = htons(PORT_NUM);
    int re = 0;
    re = connect(sock,(struct sockaddr *)&servaddr,sizeof(servaddr));//연결 요청
    if(re == -1)
    {
        return -1;
    }

연결 성공하면 문자열을 입력받아 서버에 전송하는 것을 반복합시다.

    char msg[MAX_MSG_LEN]="";
    while(true)
    {
        gets_s(msg,MAX_MSG_LEN);        
        send(sock,msg,sizeof(msg),0);//송신

만약 입력한 문자열이 “exit”이면 종료하기로 합시다.

        if(strcmp(msg,"exit")==0)
        {
            break;
        }

전송 후에 서버가 보낸 메시지를 수신하여 출력합시다.

        recv(sock,msg,sizeof(msg),0);//수신
        printf("수신:%s\n",msg);
    }    
    closesocket(sock);//소켓 닫기
    WSACleanup();//윈속 해제화
    return 0;
}

다음은 이번 실습에서 작성한 소스 코드입니다.

#include "common.h"
#define PORT_NUM    10200
#define MAX_MSG_LEN 256
#define SERVER_IP   "192.168.34.50" //서버 IP 주소
int main()
{
    WSADATA wsadata;
    WSAStartup(MAKEWORD(2,2),&wsadata);//윈속 초기화	
    
    SOCKET sock;
    sock = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);//소켓 생성
    if(sock == -1){    return -1;    }

    SOCKADDR_IN servaddr={0};//소켓 주소
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr(SERVER_IP);
    servaddr.sin_port = htons(PORT_NUM);

    int re = 0;
    re = connect(sock,(struct sockaddr *)&servaddr,sizeof(servaddr));//연결 요청
    if(re == -1){    return -1;    }

    char msg[MAX_MSG_LEN]="";
    while(true)
    {
        gets_s(msg,MAX_MSG_LEN);        
        send(sock,msg,sizeof(msg),0);//송신
        if(strcmp(msg,"exit")==0){    break;    }
        recv(sock,msg,sizeof(msg),0);//송신
        printf("수신:%s\n",msg);
    }    
    closesocket(sock);//소켓 닫기
    WSACleanup();//윈속 해제화
    return 0;
}