반응형
//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(); }
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."