//server
#define WIN32_LEAN_AND_MEAN // windows.h 에서 자주 사용하지 않는 것은 컴파일에서 제외한다.
// winsock2.h 와의 충돌을 막아준다.
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
WSADATA wsadata;
if( WSAStartup(MAKEWORD(2,2), &wsadata) != 0)
{
printf("Can't Initialize Socket !\n");
return;
}
//--------------------------------------------------------------
SOCKET s = socket ( AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(4000);
addr.sin_addr.s_addr= INADDR_ANY;
if(bind ( s, (SOCKADDR*)&addr, sizeof(addr)) == -1)
{
printf("Can't bind\n");
return ;
}
//소켓 s를 멀티 케스트 그룹에 가입시킨다.
ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("234.5.5.3");
mreq.imr_interface.s_addr = INADDR_ANY;
//소켓 option을 변경해서 멀티 케스트 그룹에 가입한다.
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));
//서버를 실행해 놓으세요
//클라이언트에서 멀티 케스트 주소로 보내보세요.
while(1)
{
SOCKADDR_IN c_addr;
int sz = sizeof(c_addr);
char buf[4096] = { 0 } ;
recvfrom(s, buf, 4096, 0, (SOCKADDR*)&c_addr, &sz);
printf("%s : %s\n", inet_ntoa(c_addr.sin_addr), buf);
}
//--------------------------------------------------------------
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생성 : TCP: SOCK_STREAM : UDP :SOCK_DGRAM
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
char ip[256];
char msg[256];
while(1)
{
memset(ip, 0, 256);
memset(msg, 0, 256);
printf("전송할 상대 IP : ");
scanf("%s",ip);
fflush(stdin);
printf("전송할 문자열 : ");
//scanf("%s",msg);
gets(msg);
fflush(stdin);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(4000);
addr.sin_addr.s_addr = inet_addr( ip );
sendto(s, msg, strlen(msg)+1, 0 , (SOCKADDR *)&addr, sizeof(addr));
}
//---------------------------------------------------------------------------
closesocket(s); // 소켓 닫기
//--------------------------------------------------------------
//------------------------------------------
WSACleanup();
}