세상을 이롭게

BroadCast Example Source Code (winsock.h) C++ Window 본문

C,C++

BroadCast Example Source Code (winsock.h) C++ Window

2022. 7. 26. 16:52

winsock.h을 이용한 Broadcast code는 잘 보이지 않아서 정리해 놓는다.
이 코드는 어디선가 돌아다니는 코드를 아주 살짝 수정했을 뿐이다.

Broadcast 방식은 프로토콜과 포트 번호만 일치시키면 동작한다. 아래의 포트번호를 수정하여 사용해보자.

Broadcast Send Code

#include <iostream> 
#include <winsock.h> 
#pragma comment( lib, "ws2_32.lib" ) 
using namespace std;

void main(void) {
    WSAData wsaData;
    SOCKET sock = NULL;
    SOCKADDR_IN addrSender;
    try {

        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
            throw WSAGetLastError();
        }

        sock = socket(AF_INET, SOCK_DGRAM, 0);
        if (sock == INVALID_SOCKET) {
            throw WSAGetLastError();
        }

        BOOL bEnable = TRUE;
        if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bEnable, sizeof(bEnable)) == SOCKET_ERROR) {
            throw WSAGetLastError();
        }
        memset((void*)&addrSender, 0, sizeof(SOCKADDR));
        addrSender.sin_family = AF_INET;
        //addrSender.sin_port = htons(9000);
        addrSender.sin_port = htons(9901);
        addrSender.sin_addr.s_addr = htonl(INADDR_BROADCAST);

        char buf[1024] = { 0, };
        while (1)
        {
            cin >> buf;
            if (sendto(sock, buf, strlen(buf), 0, (SOCKADDR*)&addrSender, sizeof(SOCKADDR)) == SOCKET_ERROR) {
                throw WSAGetLastError();
            }
        }
    }
    catch (int& ex) {
        cout << "Error Code: " << ex << endl;
    }
    closesocket(sock);
    WSACleanup();
}

 

Broadcast Recv Code

#include <iostream>
#include <winsock.h>
#pragma comment( lib, "ws2_32.lib" )
using namespace std;

void main(void) {
    WSAData wsaData;
    SOCKET sockReceiver = NULL;
    SOCKADDR_IN addrReceiver;
    try {

        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
            throw WSAGetLastError();
        }

        sockReceiver = socket(AF_INET, SOCK_DGRAM, 0);
        if (sockReceiver == INVALID_SOCKET) {
            throw WSAGetLastError();
        }

        BOOL bEnable = TRUE;
        if (setsockopt(sockReceiver, SOL_SOCKET, SO_BROADCAST, (char*)&bEnable, sizeof(bEnable)) == SOCKET_ERROR) {
            throw WSAGetLastError();
        }
        memset((void*)&addrReceiver, 0, sizeof(SOCKADDR));
        addrReceiver.sin_family = AF_INET;
        //addrReceiver.sin_port = htons(9000);
        addrReceiver.sin_port = htons(9901);
        addrReceiver.sin_addr.s_addr = htonl(INADDR_ANY);

        if (bind(sockReceiver, (SOCKADDR*)&addrReceiver, sizeof(SOCKADDR)) == SOCKET_ERROR) {
            throw WSAGetLastError();
        }

        SOCKADDR_IN senderAddr;
        int addrLen = sizeof(SOCKADDR_IN);
        char buf[1024] = { 0, };
        while (1) {
            if (recvfrom(sockReceiver, buf, strlen(buf), 0, (SOCKADDR*)&senderAddr, &addrLen) == SOCKET_ERROR) {
                throw WSAGetLastError();
            }
            cout << buf << endl; memset(buf, 0, 1024);
        }
    }
    catch (int& ex) {
        cout << "Error Code: " << ex << endl;
    }
    closesocket(sockReceiver);
    WSACleanup();
}

끝.

파일첨부

broadcastSend.cpp
0.00MB
broadcastRecv.cpp
0.00MB