benny@vlss.amdahl.com (Benny Schnaider) (04/11/91)
Hi, I am trying to broadcast a message over the internet by using the INADDR_BROADCAST shorthand notation. I tried this on SunOS 4.01 and got: Network is unreachable... On other system that I tried the same code it worked. Code is enclosed. 1. What is the problem ? 2. How common is it to use INADDR_BROADCAST ? Thanks, Benny. ____________________________________________________________________________ int sd, on; struct sockaddr_in sockAddr; /* * zero out the socket structures */ bzero(&sockAddr, sizeof(sockAddr)); /* * Open the socket */ if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { close(sd); BPCerror(LOG_WARNING, "in socket creation (request)"); return(ERROR); } /* * Mark the socket to allow broadcast. */ on = 1; if ((setsockopt(sd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on))) == -1) { close(sd); BPCerror(LOG_WARNING, "in SO_BROADCAST"); return(ERROR); } /* * Fill sockAddrAs */ sockAddr.sin_family = AF_INET; sockAddr.sin_port = IPPORT_BOOTPS; sockAddr.sin_addr.s_addr = INADDR_ANY; /* * Bind the socket */ if (bind(sd, &sockAddr, sizeof(sockAddr)) == -1) { close(sd); BPCerror(LOG_WARNING, "in socket binding (request)"); return(ERROR); } /* * Broadcast the request */ sockAddr.sin_addr.s_addr = INADDR_BROADCAST; if (sendto(sd, msg, sizeof(*msg), 0, &sockAddr, sizeof(sockAddr)) == -1) { close(sd); BPCerror(LOG_WARNING, "sendto"); return(ERROR); } /* sendto */ close(sd); return(OK); } /* BPCrequestIP() */ ----------------------------------------------------------------- Benny Schnaider benny@vlss.amdahl.com Amdahl Corporation, 1250 EAST Arques Avenue, M/S 246, Sunnyvale CA, 94088-3470 (408) 296 - 0596, (408) 746-3440 ----------------------------------------------------------------- -- ----------------------------------------------------------------- Benny Schnaider benny@vlss.amdahl.com Amdahl Corporation, 1250 EAST Arques Avenue, M/S 246, Sunnyvale CA, 94088-3470 (408) 296 - 0596, (408) 746-3440 -----------------------------------------------------------------
ken@racerx.UUCP (Ken Hardy) (04/12/91)
In article <BENNY.91Apr10110956@dimona.vlss.amdahl.com>, benny@vlss.amdahl.com (Benny Schnaider) writes: > Hi, > > I am trying to broadcast a message over the internet by using the > INADDR_BROADCAST shorthand notation. I tried this on SunOS 4.01 > and got: Network is unreachable... On other system that I tried > the same code it worked. > Code is enclosed. > > 1. What is the problem ? > 2. How common is it to use INADDR_BROADCAST ? > > Thanks, > Benny. You need to have a valid network in the network portion of the internet address. This is a routine I use on Suns to build a broadcast address. May not be cleanest code, but it works on Sun 4.0 & 4.1. The print statements yield: Name = [racerx] Host ID 80420006 Net ID 00008042 Bcast ID 8042ffff This get physically resolved on our system to a broadcast ethernet address. This may or may not be passed by bridges. IP routers may not pass it based on the network portion of the IP address, and even if a bridge or router passes it, other IP hosts on another network may not pay attention to it if they have another network i.d. ---------------------------------------------------------------- int bcast_address () /* * */ { struct in_addr bcip; unsigned ipad, netp; extern struct hostent *getmyhostent () ; if (my_he == (struct hostent *)0) { my_he = getmyhostent () ; memcpy (&myip.s_addr, my_he->h_addr, sizeof (myip.s_addr)); memcpy (&my_ipaddr[0], my_he->h_addr, sizeof (myip.s_addr) ) ; } netp = inet_netof (myip); bcip = inet_makeaddr (netp, INADDR_BROADCAST); if (bug) { printf ("Name = [%s]\n", my_he->h_name); printf ("Host ID %08lx\n", htonl (myip.s_addr)); printf ("Net ID %08lx\n", netp); printf ("Bcast ID %08lx\n", htonl (bcip.s_addr)); } RETURN (bcip.s_addr); } ---------------------------------------------------------------- -- Ken Hardy uunet!racerx!ken ken@racerx.UUCP