winsockブロードキャストパケットの送受信

9059 ワード

ブロードキャストパッケージの概念
ブロードキャストパケットは、通常、1つのアプリケーションがローカルネットワークでリソースを見つけることを望んでいるが、アプリケーションはそのリソースのアドレスについて事前の知識を持っていない2つの理由で使用される.2いくつかの重要な機能、例えばルーティングは、それらの情報をすべての見つかった隣接機に送信することを要求する.ブロードキャストされる情報の宛先アドレスは、この情報がどのネットワーク上でブロードキャストされるかに依存する.インターネットドメインでは、ブロードキャスト用の速記アドレスがサポートされています-INADDR_BROADCAST.ブロードキャストを使用する前に、データ・ジャケット・インタフェースをバンドルする必要があるため、受信したブロードキャスト・メッセージには送信者のアドレスとポートがあります.
ブロードキャスト通信は、接続されていない通信であり、通信前に接続を確立する必要はありません.listenとacceptは必要ありませんが、ブロードキャストを受信するためにsocketをバインドする必要があります.
☛ブロードキャストパケットの送信は、タイムアウトの設定、ブロードキャストの許可などのsocket設定socketを作成します.ブロードキャストを使用する前にsocketをバインドする必要があります.このステップは有無にかかわらず、ない場合は、システムが自動的に未使用ポートにバインドされます.放送を送る.ブロードキャストされたポート番号は、受信者がバインドしたポート番号と一致します.
#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <string.h>

#pragma comment(lib, "ws2_32.lib")

void autoCleanup()
{
    WSACleanup();
}

int _tmain(int argc, _TCHAR* argv[])
{

    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested=MAKEWORD(2,2);
    int ret;
    ret = WSAStartup(wVersionRequested,&wsaData);

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    int bc = 1;
    //        
    int so_broadcast = TRUE;
    ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&so_broadcast, sizeof(so_broadcast));
    
    sockaddr_in addr;
    addr.sin_family = AF_INET; //        , IP  
    addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 
    addr.sin_port = htons(2526);

    //         ,       。          
    //ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));

    struct sockaddr_in b_addr;
    b_addr.sin_family = AF_INET;
    b_addr.sin_addr.S_un.S_addr =htonl(INADDR_BROADCAST);
    b_addr.sin_port = htons(2527);


    char buff[50] = "Hello, world!";
    while (1)
    {
        ret = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*)&b_addr, sizeof(b_addr));

        printf("send... %d
", WSAGetLastError()); Sleep(3000); } closesocket(sock); atexit(autoCleanup); return 0; }

☛受信ブロードキャストパケット受信者は、ブロードキャスト側のポート番号を知ってから、同じポート番号をバインドして正しく受信する必要があります.理屈は簡単で、ポートにバインドされていないと、どこでデータを受信するか分かりません.
// send.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <string.h>

#pragma comment(lib, "ws2_32.lib")

void autoCleanup()
{
    WSACleanup();
}

int _tmain(int argc, _TCHAR* argv[])
{
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested=MAKEWORD(2,2);
    WSAStartup(wVersionRequested,&wsaData);

    SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    //               
    addr.sin_port = htons(2527);

    bind(sock, (struct sockaddr *)&addr, sizeof(addr));

    struct sockaddr_in from;
    int len = sizeof(from);
    int ret;
    char buff[50];

    while (1)
    {
        ret = recvfrom(sock, buff, 49, 0, (struct sockaddr *)&from, &len);
        if (ret > 0)
        {
            buff[ret] = 0;
            printf("%s
", buff); printf("%s %d
", inet_ntoa(from.sin_addr), ntohs(from.sin_port)); } } closesocket(sock); atexit(autoCleanup); return 0; }