winsock 收發廣播包 【轉】

來源:互聯網
上載者:User

標籤:

winsock 收發廣播包

?廣播包的概念

廣播包通常為了如下兩個原因使用:1 一個應用程式希望在本網中找到一個資源,而應用程式對於該資源的地址又沒有任何先驗的知識。
2 一些重要的功能,例如路由要求把它們的資訊發送給所有找到的鄰機。
被廣播資訊的目的地址取決於這一資訊將在何種網路上廣播。Internet域中支援一個速記地址用於廣播-INADDR_BROADCAST。由於使
用廣播以前必須捆綁一個資料報套介面,所以所有收到的廣播訊息都帶有寄件者的地址和連接埠。

廣播通訊是不需連線的通訊,通訊前不需要建立串連。不需要listen和accept,但需要綁定一個socket用來接收廣播。

?廣播包的發送
建立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\n", 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\n", buff);            printf("%s %d\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port));        }    }    closesocket(sock);    atexit(autoCleanup);    return 0;}

winsock 收發廣播包 【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.