Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Feb 3rd, 2014  |  syntax: C++  |  size: 1.62 KB  |  views: 129  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. // Winsock commodities :)
  2. typedef unsigned int SOCKET;
  3. const unsigned int INVALID_SOCKET = -1;
  4.  
  5. static SOCKET Connect(const std::string &interfaceIP, const std::string &bindIP, unsigned int port)
  6. {
  7.         // Create UDP socket.
  8.         SOCKET sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
  9.         if (INVALID_SOCKET != sock_fd)
  10.         {
  11.                 // "Share" socket address.
  12.                 int sockOpt = 1;
  13.                 setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char*>(&sockOpt), sizeof(int));
  14.  
  15.                 // Enlarge (or embiggen, if you will) recv. buffer.
  16.                 sockOpt = 1024*512; // 0x80000;
  17.                 setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, reinterpret_cast<char *>(&sockOpt), sizeof(int));
  18.  
  19.                 // Bind to interface(s).
  20.                 sockaddr_in address;
  21.                 memset(&address, 0, sizeof(sockaddr_in));
  22.                 address.sin_family = AF_INET;
  23.                 address.sin_port = htons(port);
  24.                 address.sin_addr.s_addr = inet_addr(interfaceIP.c_str()); /* INADDR_ANY */
  25.                 int addrLen = sizeof(sockaddr_in);
  26.                 if (0 == bind(sock_fd, reinterpret_cast<sockaddr *>(&address), addrLen))
  27.                 {
  28.                         // Join multicast.
  29.                         ip_mreq multicast;
  30.                         multicast.imr_multiaddr.s_addr = inet_addr(bindIP.c_str());
  31.                         multicast.imr_interface = address.sin_addr;
  32.  
  33.                         if (0 == setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<char *>(&multicast), sizeof(ip_mreq)))
  34.                         {
  35.                                 // Non-blocking socket, please.
  36. //                              fcntl(sock_fd, F_SETFL, O_NONBLOCK);
  37.  
  38.                                 std::cout << "Socket joined multicast: " << bindIP.c_str() << ":" << port << std::endl;
  39.                                 return sock_fd;
  40.                         }
  41.                 }
  42.  
  43.  
  44.                 close(sock_fd);
  45.         }
  46.  
  47.         std::cout << "Failed to join multicast: " << bindIP.c_str() << ":" << port << std::endl;
  48.  
  49.         return INVALID_SOCKET;
  50. }