Advertisement
Guest User

Untitled

a guest
Oct 26th, 2016
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. + (void) doBrowseForServers
  2. {
  3. // http://mbielanczuk.com/2013/07/browsing-network-for-sql-server-instances-in-c/
  4. // used as a reference.
  5. SOCKET sock;
  6. int broadcast = 1;
  7.  
  8. struct timeval timeout;
  9. timeout.tv_sec = 5; // 10 second timeout
  10. timeout.tv_usec = 0;
  11.  
  12. if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
  13. {
  14. NSLog(@"MSSQLBrowserServiceClient failed to initialize socket.");
  15. return;
  16. }
  17.  
  18. // Setting socket broadcast option.
  19. if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof(broadcast)) == -1)
  20. {
  21. NSLog(@"MSSQLBrowserServiceClient failed to set broadcast option.");
  22. return;
  23. }
  24.  
  25. // Set a timeout so that we do not wait forever.
  26. if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) == -1)
  27. {
  28. NSLog(@"MSSQLBrowserServiceClient failed to set send timeout.", errno);
  29. return;
  30. }
  31.  
  32. // Set a timeout so that we do not wait forever.
  33. if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) == -1)
  34. {
  35. NSLog(@"MSSQLBrowserServiceClient failed to set receive timeout.", errno);
  36. return;
  37. }
  38.  
  39. if(sendBroadcast(sock, MSSQL_BROWSER_SERVICE_PORT))
  40. {
  41. NSString * response = [self reciveBroadcastRespondFromSocket: sock
  42. usingPort: MSSQL_BROWSER_SERVICE_PORT];
  43.  
  44. NSDate * lastSeen = [NSDate date];
  45.  
  46. if(0 != response.length)
  47. {
  48. // Processing code omitted to focus on send/receive
  49. } // End of we had responses
  50. }
  51. else
  52. {
  53. NSLog(@"MSSQLBrowserServiceClient failed to browse for servers.");
  54. }
  55. } // End of beginBrowseForServers
  56.  
  57. bool sendBroadcast(SOCKET sock, int port)
  58. {
  59. struct sockaddr_in bcastAddr;
  60. memset(&bcastAddr, 0, sizeof(bcastAddr));
  61. bcastAddr.sin_family = AF_INET;
  62. bcastAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
  63. bcastAddr.sin_port = htons(port);
  64. char query = 0x02;
  65. if (sendto(sock, &query, sizeof(query), 0, (struct sockaddr *)&bcastAddr, sizeof(bcastAddr)) == -1)
  66. {
  67. return 0;
  68. }
  69.  
  70. return 1;
  71. }
  72.  
  73. + (NSString*) reciveBroadcastRespondFromSocket: (SOCKET) sock
  74. usingPort: (int) port
  75. {
  76. ssize_t recvBytes = 0;
  77. char buf[512] = {0x00};
  78. memset(buf,'', 512);
  79.  
  80. NSMutableData * mutableData = [NSMutableData data];
  81.  
  82. struct sockaddr_in recvAddr;
  83. memset(&recvAddr, 0, sizeof(recvAddr));
  84. recvAddr.sin_family = AF_INET;
  85. recvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  86. recvAddr.sin_port = htons(port);
  87. socklen_t recvAddrLen = sizeof(recvAddr);
  88.  
  89. while ((recvBytes = recvfrom(sock, buf, sizeof(buf)-1, 0, (struct sockaddr*)&recvAddr, &recvAddrLen)) != -1)
  90. {
  91. [mutableData appendBytes: buf
  92. length: recvBytes];
  93. }
  94.  
  95. if(mutableData.length <= 3)
  96. {
  97. return nil;
  98. }
  99.  
  100. char * bytes = (char*)[mutableData bytes];
  101.  
  102. // Process code removed to focus on networking bits.
  103. // ....
  104.  
  105. return @"";
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement