-
Notifications
You must be signed in to change notification settings - Fork 1
/
browser.c
109 lines (83 loc) · 2.76 KB
/
browser.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <net/if.h>
#include "dns_sd.h"
struct BrowseReplyData{
DNSServiceErrorType errorCode;
char *serviceName;
char *regType;
char *replyDomain;
};
void customBrowseReply( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode,
const char *serviceName, const char *regtype, const char *replyDomain, void *context)
{
// init BrowseReplyData
struct BrowseReplyData *replyData=context;
replyData->errorCode=errorCode;
replyData->serviceName=malloc(strlen(serviceName)+1);
replyData->regType=malloc(strlen(regtype)+1);
replyData->replyDomain=malloc(strlen(replyDomain)+1);
strcpy(replyData->serviceName, serviceName);
strcpy(replyData->regType, regtype);
strcpy(replyData->replyDomain, replyDomain);
printf("In BrowseReply callback!!\n");
if(flags == kDNSServiceFlagsMoreComing){
printf("flag: kDNSServiceFlagsMoreComing\n");
}else if(flags == kDNSServiceFlagsAdd){
printf("flag: kDNSServiceFlagsAdd\n");
}else{
printf("flag: %d\n", flags);
}
printf("Error Code: %d\n", errorCode);
printf("Service Name: %s\n", serviceName);
printf("RegType: %s\n", regtype);
printf("Domain: %s\n", replyDomain);
}
int main(int argc, char* argv[])
{
DNSServiceRef ref;
DNSServiceErrorType result;
DNSServiceFlags nativeFlag=0;
struct BrowseReplyData *replyData;
int port = 11234;
char* serviceType="_personal._tcp";
char* netInterface="eth0";
int netIndex=if_nametoindex(netInterface);
int serviceFD;
char input;
printf("Starting to Discover service...\n");
result=DNSServiceBrowse(
&ref,
nativeFlag,
netIndex,
serviceType,
NULL, /* domain */
&customBrowseReply, /* callback */
replyData /* context, user-defined that will be an argument of callback */
);
if (result == kDNSServiceErr_NoError){
printf("Browse service success!!\n");
}else{
printf("Browser service fail!!\n");
printf("Error code: %d\n", result);
return 1;
}
//serviceFD=DNSServiceRefSockFD(ref);
// this method will active the callback register before.
// TO-DO if no service is available, will block the program. solve it.
result=DNSServiceProcessResult( ref );
if (result == kDNSServiceErr_NoError){
printf("Browse response success!!\n");
printf("%s %s %s\n", replyData->serviceName, replyData->regType, replyData->replyDomain);
}else{
printf("Browse response fail!!\n");
printf("Error code: %d\n", result);
return 1;
}
printf("press 'q' to exist:\n");
while ((input=getchar()) != -1 && input!='q');
// this must be call before calling DNSServiceBrowser again.
DNSServiceRefDeallocate(ref);
return 0;
}