소켓 기본 C++ TCP
시작하기앞서서 저가 설명하는내용은 저가 이해한대로쓴것이며 주관적이고,
이 카테고리와 더불어 소켓에 대한 글을 쓴 목적은 복습하기위함입니다.
잘못된부분이있다면 댓글을 달아주세요.
사용한 언어는 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();
}
이렇게 해주시면 윈도우소켓 기본에 대한 첫번째글은 여기까지 하구요.
다음에는 서버와 클라이언트간의 데이터를 통신할수있는 방법에 대한 글을 쓰겠습니다
감사합니다!
'🧼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 |
댓글