Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Winsock commodities :)
- typedef unsigned int SOCKET;
- const unsigned int INVALID_SOCKET = -1;
- static SOCKET Connect(const std::string &interfaceIP, const std::string &bindIP, unsigned int port)
- {
- // Create UDP socket.
- SOCKET sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (INVALID_SOCKET != sock_fd)
- {
- // "Share" socket address.
- int sockOpt = 1;
- setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char*>(&sockOpt), sizeof(int));
- // Enlarge (or embiggen, if you will) recv. buffer.
- sockOpt = 1024*512; // 0x80000;
- setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, reinterpret_cast<char *>(&sockOpt), sizeof(int));
- // Bind to interface(s).
- sockaddr_in address;
- memset(&address, 0, sizeof(sockaddr_in));
- address.sin_family = AF_INET;
- address.sin_port = htons(port);
- address.sin_addr.s_addr = inet_addr(interfaceIP.c_str()); /* INADDR_ANY */
- int addrLen = sizeof(sockaddr_in);
- if (0 == bind(sock_fd, reinterpret_cast<sockaddr *>(&address), addrLen))
- {
- // Join multicast.
- ip_mreq multicast;
- multicast.imr_multiaddr.s_addr = inet_addr(bindIP.c_str());
- multicast.imr_interface = address.sin_addr;
- if (0 == setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<char *>(&multicast), sizeof(ip_mreq)))
- {
- // Non-blocking socket, please.
- // fcntl(sock_fd, F_SETFL, O_NONBLOCK);
- std::cout << "Socket joined multicast: " << bindIP.c_str() << ":" << port << std::endl;
- return sock_fd;
- }
- }
- close(sock_fd);
- }
- std::cout << "Failed to join multicast: " << bindIP.c_str() << ":" << port << std::endl;
- return INVALID_SOCKET;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement