이번에는 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; }