본문 바로가기
IT창고/Network

UDP/MultiCast

by 창구창고 2007. 1. 22.
반응형
//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();
}
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."