The following code gives ENETUNREACH on RedHat 6.1 but works on other versions of Linux: #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #define SOCKET_ERROR -1 #define closesocket close typedef int SOCKET; typedef struct sockaddr SOCKADDR; typedef struct sockaddr_in SOCKADDR_IN; #define FALSE 0 #define TRUE 1 int sendbroadcast(int sendport, const char* sendbuf, int sendbytes) { SOCKET s; if ((s = socket(PF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR) return errno; int err = 0; int optval = TRUE; if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<const char*> (&optval), sizeof(optval)) == SOCKET_ERROR) err = errno; else { SOCKADDR_IN sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); sockAddr.sin_family = AF_INET; sockAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); sockAddr.sin_port = htons(sendport); int flags = 0; int bytes = sendto(s, sendbuf, sendbytes, flags, reinterpret_cast<SOCKADDR*>(&sockAddr), sizeof(sockAddr)); if (bytes == SOCKET_ERROR) err = errno; } closesocket(s); return err; }
This smells like a kernel problem, so I'm changing the component. What kernel are you using?
assigned to dledford
This depends solely on routing setup