/*++ Copyright (c) 2000, Microsoft Corporation Module Name: limitbcast.c Abstract: This module implements a program demonstrating the use of the SIO_LIMIT_BROADCASTS socket option. The default behavior of the system is to send limited broadcasts (i.e. broadcasts sent to 255.255.255.255) on all local interfaces, which violates the IETF Host Requirements stating that limited broadcasts appear only on the sending socket's interface. This socket option allows an application to specify that a socket's limited-broadcasts obey the traditional semantics. Author: Abolade Gbadegesin (aboladeg) 29-October-1998 Revision History: --*/ #include #include #include #include int __cdecl main( int argc, char* argv[] ) { SOCKADDR_IN DestAddrIn; SOCKADDR_IN LocalAddrIn; ULONG Option; SOCKET Socket; WSADATA WsaData; // // Check command-line arguments // ZeroMemory(&LocalAddrIn, sizeof(LocalAddrIn)); LocalAddrIn.sin_family = AF_INET; if (argc != 3 || !(LocalAddrIn.sin_addr.s_addr = inet_addr(argv[1])) || !(LocalAddrIn.sin_port = ntohs((USHORT)atol(argv[2])))) { printf("Usage: %s \n", argv[0]); return 0; } // // Initialize Windows sockets, create a UDP socket, // and enable broadcasts on the socket. // Then bind it to the specified local IP address. // WSAStartup(0x0202, &WsaData); if ((Socket = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { printf("socket: %d\n", WSAGetLastError()); return 0; } Option = 1; if (setsockopt( Socket, SOL_SOCKET, SO_BROADCAST, (PCHAR)&Option, sizeof(Option) ) == SOCKET_ERROR) { printf("setsockopt: %d\n", WSAGetLastError()); } if (bind(Socket, (PSOCKADDR)&LocalAddrIn, sizeof(LocalAddrIn)) == SOCKET_ERROR) { printf("bind: %d\n", WSAGetLastError()); return 0; } // // Initialize the destination address, // and enter a loop where we prompt for the limit-broadcasts setting // and send a message using the specified setting. // ZeroMemory(&DestAddrIn, sizeof(DestAddrIn)); DestAddrIn.sin_family = AF_INET; DestAddrIn.sin_addr.s_addr = INADDR_BROADCAST; DestAddrIn.sin_port = LocalAddrIn.sin_port; do { ULONG Length; ULONG LimitBroadcasts; printf("Enter a value (0 or 1) for the SIO_LIMIT_BROADCASTS option.\n"); printf("bcast> "); if (!scanf("%d", &LimitBroadcasts)) { break; } if (WSAIoctl( Socket, SIO_LIMIT_BROADCASTS, (PCHAR)&LimitBroadcasts, sizeof(LimitBroadcasts), NULL, 0, &Length, NULL, NULL ) == SOCKET_ERROR) { printf("WSAIoctl: %d\n", WSAGetLastError()); } if (sendto( Socket, (PCHAR)&DestAddrIn, sizeof(DestAddrIn), 0, (PSOCKADDR)&DestAddrIn, sizeof(DestAddrIn) ) == SOCKET_ERROR) { printf("sendto: %d\n", WSAGetLastError()); } } while(TRUE); closesocket(Socket); WSACleanup(); return 0; }