우선 소켓 통신을 하기에 앞서 사용해야할 라이브러리를 사용할 수 있도록 설정하겠습니다.
비주얼 스튜디오 프로젝트 생성을 했다면, 우측 상단 탭에서 프로젝트 -> 속성 클릭
구성속성 -> 고급에서
문자 집합을 멀티바이트 문자 집합 사용으로 변경
다음으로, 링커 -> 입력으로 들어가 추가 종속성을 추가한다.
라이브러리를 추가하는 방식이 번거롭다면 임의 위치에 아래 코드를 넣어서 사용해도 됩니다.
#pragma comment(lib, "ws2_32");
를 넣어주면 소켓 통신 기본 준비는 끝납니다.
서버와 클라이언트는 각각의 프젝트로 생성하는 것을 추천드립니다.
서버 소스코드
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment(lib, "ws2_32");
#define BUFSIZE 512
void err_quit(const char* msg) {
LPVOID IpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&IpMsgBuf, 0, NULL);
exit(-1);
}
int main(int argc, char* argv[]) {
int retval;
//원속초기화
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
return -1;
//MessageBox(NULL, "원속 초기화 성공", "알림", MB_OK);
//socket()
SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);
if (listen_sock == INVALID_SOCKET) err_quit("socket()");
printf("소켓이 생성되었습니다\n");
//MessageBox(NULL, "TCP 소켓성공", "알림", MB_OK);
//bind()
SOCKADDR_IN serveraddr;
ZeroMemory(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(9000);
bind(listen_sock, (SOCKADDR*)&serveraddr, sizeof(serveraddr));
printf("Bind 완료 되었습니다.\n");
//listen()
listen(listen_sock, SOMAXCONN);
printf("connect 연결을 기다리는 중..\n");
//통신에 사용할 변수
SOCKET client_sock;
SOCKADDR_IN clientaddr;
int addrlen;
char buf[BUFSIZE + 1];
//accept()
addrlen = sizeof(clientaddr);
client_sock = accept(listen_sock, (SOCKADDR*)&clientaddr, &addrlen);
printf("요청을 받았습니다.\n");
//recv()
retval = recv(client_sock, buf, BUFSIZE, 0);
printf("메세지를 수신하였습니다.\n");
//받는 데이터 출력
buf[retval] = '\0';
printf("[TCP/%s:%d] %s\n",
inet_ntoa(clientaddr.sin_addr),
ntohs(clientaddr.sin_port), buf);
//closesocket
closesocket(listen_sock);
//원속 종료
WSACleanup();
return 0;
}
클라이언트 소스코드
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32");
#define BUFSIZE 512
void err_quit(const char* msg) {
LPVOID IpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&IpMsgBuf, 0, NULL);
exit(-1);
}
int main(int argc, char* argv[]) {
//원속 초기화
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
return -1;
//MessageBox(NULL, "원속 초기화 성공", "알림", MB_OK);
//socket()
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) err_quit("socket()");
printf("소켓이 생성되었습니다.\n");
//MessageBox(NULL, "TCP 소켓성공", "알림", MB_OK);
//connect()
SOCKADDR_IN serveraddr;
ZeroMemory(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(9000);
connect(sock, (SOCKADDR*)&serveraddr, sizeof(serveraddr));
printf("connect 연결요청!!\n");
//서버로 보낼 스트링 설정
char buf[BUFSIZE + 1];
sprintf(buf, "hello world!");
//send()
send(sock, buf, strlen(buf), 0);
printf("메세지를 보냅니다.\n");
//closesocket()
closesocket(sock);
//원속 종료
WSACleanup();
return 0;
}
간단하게 hello world를 클라이언트가 서버에게 보내는 코드였습니다.
'네트워크' 카테고리의 다른 글
ARP(Address Resolution Protocol - 주소 결정 프로토콜) (0) | 2020.08.29 |
---|---|
[c언어] 3바이트, 6바이트 데이터 타입 만들기 (0) | 2020.08.16 |
[c언어]8바이트를 위한 htonl (1) | 2020.08.16 |
UDP 방식으로 소켓 통신 (0) | 2020.08.13 |
LTE 네트워크 구조 학습 #1 (0) | 2020.08.07 |