본문 바로가기
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();
    }
    
    반응형

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