🧼C, C++/네트워크

소켓 기본 C++ TCP

Mawile 2020. 9. 18.
728x90

시작하기앞서서 저가 설명하는내용은 저가 이해한대로쓴것이며 주관적이고,

이 카테고리와 더불어 소켓에 대한 글을 쓴 목적은 복습하기위함입니다.

잘못된부분이있다면 댓글을 달아주세요.

사용한 언어는 STDC++11,14에서 정상작동확인되었으며,

IDE는 DEVCPP를 사용했습니다


히헣 소켓에 대한 글을 처음써보기도하고

C언어를 배워왔지만

공부하면서 소켓이 개인적으로 제일 재밌는것같아요 ㅋㅋㅋ

 

먼저 저는 C언어를 개발할때 통합개발환경으로는 비주얼스튜디오보다는 devcpp를 거의 99% 사용합니다

왜냐면 엄청 가볍고 소스코드하나를 빨리빨리 만들수있죠

들어가서 Ctrl+N이면 그냥 바로만들수있기때문에  쓰는건데

비쥬얼스튜디오에서는

#pragma comment(lib,"ws2_32.lib")

이렇게치면은 winsock2 헤더파일이 정상적으로 작동하는데

devcpp에서는 이렇게안됩니다 그래서 찾아보다가 방법을 찾았어요!

 

먼저,

[도구(T)->컴파일러 설정(C)]을 들어가줍니다

아래에 링커추가명령에 

-lws2_32

이렇게 치면 됩니다!

그리고 추가로!

위에

-std=c++14

이 명령은 Devcpp가 기본적으로 C98 을 기본으로하는데

채신기술을 사용하기위해 C++14로 바꿔준거에요.


[  소켓 헤더파일 소개  ]

먼저! 저는 소켓함수를 사용하기위해 헤더파일을 추가해줄건데

#include <winsock2.h>

이렇게 써주시면 됩니다~~


[[[   서버   ]]]

[  첫번째  ]

#include <winsock2.h>
#include <iostream>
using namespace std;

int main(){
WSADATA data;
WSAStartup(MAKEWORD(2,2), &data);

//

WSACleanup();
}

따란~~~

소켓만들때 기본틀인것같아요

// 이렇게 주석을적은 공간에 추가로 아래에서 설명해드리는것들을 적어주세요

[  두번째  ]

SOCKET skt;
skt = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);

소켓의 형식?? 을 만들어주는것같아요

PF_INET은 IPv4인터넷 프로토콜 그러니까 cmd에다가 ipconfig치면 기본적으로 나오는 기본아이피가

IPv4인터넷 프로토콜로 되있어요.

PF_INET은 프로토콜체계로 불러온다고하고AF_INET은 주소의체계로 불러온다했는데

솔직히 뭔차인지는 정확히모르겠어요(ㅋㅋ)

IPPROTO_TCP는 meterpreter의 형식입니다.메타스플로잇으로 MSFCONSOLE사용할때 tcp로할지 https로할지 udp로할지 정하잖아요?그런거예요!

[  세번째  ]

SOCKADDR_IN addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(4444);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

SOCKADDR_IN은 개체의 정보를 담는공간같아요!프로토콜체계정보와 포트에 대한 정보를 담을게요

[  네번째  ]

bind(skt,(SOCKADDR*)&addr,sizeof(addr));
listen(skt,SOMAXCONN);

클라이언트 측의 접속응답을 받아옵니다!

[  다섯번째  ]

SOCKADDR_IN client = {};
int client_size = sizeof(client);
SOCKET client_sock = accept(skt, (SOCKADDR*)&client,&client_size);

이거는 클라이언트의 정보를 담을 공간인것같습니다~


[  서버 풀코드  ]

#include <winsock2.h>
#include <iostream>
using namespace std;

int main(){
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);

SOCKET skt;
skt = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);

SOCKADDR_IN addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(4444);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(skt, (SOCKADDR*)&addr,sizeof(addr));
listen(skt,SOMAXCONN);

SOCKADDR_IN client = {};
int client_size = sizeof(client);
ZeroMemory(&client,client_size);
SOCKET client_sock = accept(skt,(SOCKADDR*)&client,&client_size);

closesocket(client_sock);
closesocket(skt);
WSACleanup();
}

그다음 closesocket을 이용하여 소켓을 닫아주셔야합니다!


[[[   클라이언트   ]]]

클라이언트는 서버를 코딩한것을 살짝 바꿔주시면됩니다!

#include <winsock2.h>
#include <iostream>
using namespace std;

int main(){
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);

SOCKET skt;
skt = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);

SOCKADDR_IN addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(4444);
addr.sin_addr.s_addr = inet_addr("서버아이피");

connect(skt, (SOCKADDR*)&addr,sizeof(addr));

closesocket(skt);
WSACleanup();
}

 


이렇게 해주시면 윈도우소켓 기본에 대한  첫번째글은 여기까지 하구요.

다음에는 서버와 클라이언트간의 데이터를 통신할수있는 방법에 대한 글을 쓰겠습니다

 

감사합니다!

728x90

'🧼C, C++ > 네트워크' 카테고리의 다른 글

소켓 기본 틀 #1  (0) 2020.10.05
리버스 쉘 Reverse Shell C++  (0) 2020.10.05
실시간 채팅 프로그램 C++ TCP  (6) 2020.10.01
백도어 만들기 C++ TCP  (0) 2020.09.26
소켓 데이터 C++ TCP  (0) 2020.09.24

댓글