//server
#define WIN32_LEAN_AND_MEAN // windows.h 에서 자주 사용하지 않은 것은 컴파일에서 제외 한다.
// winsock2.h외의 충돌을 막아 준다.
#include<stdio.h>
#include<windows.h>
#include<winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
WSADATA wsadata;
//if(WSAStartup(0x0202, &wsadata) != 0) //0x0202는 뒤에서부터 읽어서 2.2버젼을 쓰라는 이야기다.
if(WSAStartup(MAKEWORD(2,2), &wsadata) != 0) //많이 사용... 앞에서 부터 읽는다.
{
printf("Can't Initialize Socket !\n");
return ;
}
//------------------------------------------
//1. socket생성 : TCP: SOCK_STREAM : UDP :SOCK_DGRAM
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
//2. 생성된 소켓에 주소를 지정.
SOCKADDR_IN addr = { 0 };
addr.sin_family = AF_INET; // 주소 종류 (AF_INET : IP 주소라는 의미..
addr.sin_port = htons(4000); //Port #
addr.sin_addr.s_addr = inet_addr("61.81.99.54");
if(bind(s,(SOCKADDR*)&addr, sizeof(addr)) == -1) //서버의 닫혀 있는 상태를 대기 상태로 바꿔준다. 이순간 소켓은 내부적으로 접속요청 큐와 접속 완료 큐가 만들어진다.
{
printf("Can't bind \n");
return;
}
//3. 소켓을 대기 상태로 전환한다.
if(listen(s, 5) == -1)
{
printf("Can't Listen\n");
return;
}
printf("클리이언트를 대기합니다. \n");
//4. 이제 Client 에서 부터 전달된 요청을 허용한다.
while(1)
{
SOCKADDR_IN c_addr;
int size = sizeof(c_addr);
SOCKET c_s = accept(s, (SOCKADDR*)&c_addr, &size); //억셉트를 눌렀는데 대기 큐에 아무도 없으면 대기한다.
printf("클라이언트가 접속했습니다. IP : %s\n", inet_ntoa(c_addr.sin_addr));
}
//---------------------------------------------------------------------------
closesocket(s); // 소켓 닫기
//--------------------------------------------------------------
//------------------------------------------
WSACleanup();
}
//client
#define WIN32_LEAN_AND_MEAN // windows.h 에서 자주 사용하지 않은 것은 컴파일에서 제외 한다.
// winsock2.h외의 충돌을 막아 준다.
#include<stdio.h>
#include<windows.h>
#include<winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
WSADATA wsadata;
//if(WSAStartup(0x0202, &wsadata) != 0) //0x0202는 뒤에서부터 읽어서 2.2버젼을 쓰라는 이야기다.
if(WSAStartup(MAKEWORD(2,2), &wsadata) != 0) //많이 사용... 앞에서 부터 읽는다.
{
printf("Can't Initialize Socket !\n");
return ;
}
//------------------------------------------
//1. 소켓생성
SOCKET s = socket(AF_INET , SOCK_STREAM , 0);
//2. 소켓 주소 지정. -> 클라이언트는 생략가능
// 생략하면 OS가 임으의 포트를 지정해 준다.
//3. 서버에 접속
SOCKADDR_IN addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = htons(4000);
addr.sin_addr.s_addr = inet_addr("61.81.99.54");
if(connect(s, (SOCKADDR *) &addr, sizeof(addr)) == -1)
{
printf("서버에 연결할 수 없습니다. \n");
return ;
}
printf("서버에 연결 하였습니다.\n");
closesocket(s);
//------------------------------------------
WSACleanup();
}