From 990ffd1ec1325338de8f70bbd43de5b9181b301a Mon Sep 17 00:00:00 2001 From: talksik Date: Mon, 10 Mar 2025 11:13:32 -0700 Subject: [PATCH] adding in sample code --- .gitattributes | 2 ++ README.md | 22 ++++++++++++++ broadcaster/broadcaster | Bin 0 -> 40296 bytes broadcaster/main.cpp | 51 +++++++++++++++++++++++++++++++++ scanner/main.cpp | 62 ++++++++++++++++++++++++++++++++++++++++ scanner/scanner | Bin 0 -> 34216 bytes 6 files changed, 137 insertions(+) create mode 100644 .gitattributes create mode 100644 README.md create mode 100755 broadcaster/broadcaster create mode 100644 broadcaster/main.cpp create mode 100644 scanner/main.cpp create mode 100755 scanner/scanner diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/README.md b/README.md new file mode 100644 index 0000000..7d5e88a --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# Overview + +`cpp-bonjour` is meant to be a pure C++ library that one can use on MacOS (iOS not tested). It uses the stdlib ``. + + +# How to test +1. Run the broadcaster. +```sh +cd broadcaster +clang++ -o broadcaster main.cpp +./broadcaster +``` +You should see output of the service details of the service we are advertising. + +2. Scan for services + +```sh +cd scanner +clang++ -o scanner main.cpp +./scanner +``` +Having done this, the output should include the resolved service. diff --git a/broadcaster/broadcaster b/broadcaster/broadcaster new file mode 100755 index 0000000000000000000000000000000000000000..e1e1977570e07d2142723aca1eed805047beb05b GIT binary patch literal 40296 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 A)Bpeg literal 0 HcmV?d00001 diff --git a/broadcaster/main.cpp b/broadcaster/main.cpp new file mode 100644 index 0000000..b77fedc --- /dev/null +++ b/broadcaster/main.cpp @@ -0,0 +1,51 @@ +#include +#include +#include + +void register_service_callback(DNSServiceRef service, DNSServiceFlags flags, + DNSServiceErrorType errorCode, const char *name, + const char *regtype, const char *domain, + void *context) { + if (errorCode == kDNSServiceErr_NoError) { + std::cout << "Service registered successfully!" << std::endl; + std::cout << "Service Name: " << name << std::endl; + std::cout << "Service Type: " << regtype << std::endl; + std::cout << "Domain: " << domain << std::endl; + } else { + std::cerr << "Error registering service: " << errorCode << std::endl; + } +} + +int main() { + DNSServiceRef serviceRef; + + // Register a service with Bonjour + const char *serviceName = "My HTTP Service"; + const char *serviceType = "_flowy._tcp"; + uint16_t servicePort = 8080; + + // Register the service + DNSServiceErrorType err = DNSServiceRegister( + &serviceRef, 0, 0, serviceName, serviceType, nullptr, nullptr, + htons(servicePort), 0, nullptr, register_service_callback, nullptr); + if (err != kDNSServiceErr_NoError) { + std::cerr << "Error registering service: " << err << std::endl; + return 1; + } + + // Run the Bonjour service (advertise the service) + std::cout << "Advertising service: " << serviceName << " on port " + << servicePort << std::endl; + + // Now keep the event loop running properly to process mDNS queries + // This will block here while the service is being advertised + while (true) { + // Processing the events - this is the blocking call + DNSServiceProcessResult(serviceRef); + } + + // Cleanup when done (this line will never be reached in this version) + DNSServiceRefDeallocate(serviceRef); + + return 0; +} diff --git a/scanner/main.cpp b/scanner/main.cpp new file mode 100644 index 0000000..8bdfc57 --- /dev/null +++ b/scanner/main.cpp @@ -0,0 +1,62 @@ +#include +#include + +void DNSSD_API serviceResolveCallback( + DNSServiceRef service, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceErrorType errorCode, const char *fullName, const char *hostTarget, + uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, + void *context) { + if (errorCode == kDNSServiceErr_NoError) { + printf("Resolved Service: %s\n", fullName); + printf("Host: %s\n", hostTarget); + printf("Port: %u\n", ntohs(port)); // Convert the port to host byte order + } else { + printf("Failed to resolve service: %d\n", errorCode); + } +} + +void DNSSD_API serviceBrowseCallback( + DNSServiceRef service, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, + const char *replyDomain, void *context) { + if (errorCode == kDNSServiceErr_NoError) { + printf("Service found: %s.%s%s\n", serviceName, regtype, + replyDomain ? replyDomain : ""); + + // Now resolve the service to get port and other details + DNSServiceRef resolveRef; + DNSServiceErrorType resolveError = + DNSServiceResolve(&resolveRef, 0, interfaceIndex, serviceName, regtype, + replyDomain, serviceResolveCallback, nullptr); + + if (resolveError != kDNSServiceErr_NoError) { + printf("Error resolving service: %d\n", resolveError); + } else { + // Process the resolved service + DNSServiceProcessResult(resolveRef); + DNSServiceRefDeallocate(resolveRef); + } + } +} + +int browseServices() { + DNSServiceRef serviceRef; + DNSServiceErrorType error = DNSServiceBrowse( + &serviceRef, 0, 0, "_flowy._tcp", NULL, serviceBrowseCallback, NULL); + + if (error != kDNSServiceErr_NoError) { + fprintf(stderr, "Error browsing services: %d\n", error); + return -1; + } + + // Process the mDNS service (this will block until services are discovered) + DNSServiceProcessResult(serviceRef); + + DNSServiceRefDeallocate(serviceRef); + return 0; +} + +int main() { + browseServices(); + return 0; +} diff --git a/scanner/scanner b/scanner/scanner new file mode 100755 index 0000000000000000000000000000000000000000..b0bb17d432c5d3f9c9512d33d3da4ac9fe90d887 GIT binary patch literal 34216 zcmeI5e@t7~701u>rXiR{Xh%8t@rz~r8V~lB>5}Vl% z2qSIXkVt8_b-0bTYT8uVG>xH5qFpwDrmjqAk@iDtGO1~nr5mfV)$B*r{V~;!MA-Md z_aL^juG2d0kLet7eD68;-gD3W+-v^3*Kb_;>(wG6jUW!_a;PVV=qR~RBl-li5vr7@ z_P&PQ4K2;=%@lKRrt3P3;~YarrP>;HwPiM&|Dq{4sM;2Y#@y745;xPjjw$tM|?Ra2lic-Fa5e@_&TC_9Q zo3!J_?RK`)B|SF#mFfxh1%e$a5bO+@c4oZctyX?}xif_A>=;&y^~wA2EL5rb+O}F% z*SxdU+6}jT2vC}mRWeRi-m4O*QV)gFw&6qLZAM>H+}3#8qC8Ys7v$PG+p&FTQ$zjs zg)t~;V{u=1XzN) z2gVVC%3d(tWVX)xsXZGA~ zJnMb)eB*vkT{V0zDCa;_jD(BLy2(HPi#Z$MHP>gh6RpSkIL?u*bHwxB4&^rUJOrFr zhITC%J$Y5yO9=a+^H_y@}RAIiIP=t@6{h&3swb zK)Jo-2+p0gD0Yho0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{ zAs_^VfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5ct0!Fh8iB zn;Xa-nXA)cBTL+=c(FS*JXn!@zOG{81-)Y8#Pm%QFX}fX|4>e;KQ>eUyG_(TTTH3M z5=zCV_e?l7`cfkQxs}Isx(nCv%HsN-%Vz0u_ zV`iG&{pG076w@Tze=2rQa^HkrIO?o%KfM@h@0Qp}^eaH05zL*?3q~_y9@`T8jvaGu zpkV}Si%se3{Cpjqo2fwF74H57)cJ_B)OmBk2CAXuXtVn`z`;2(r#oW*Z2cz(*Cb!k z*CbC3u1=<}yD|UTx)Wd&AAB&GScOu5FbOt)OO!vi5_fWKHfSrQ6fQuPIl;#1uZgj3 zu6dO^^=B|jlv$vT!iQ)S7al|N_`J_AL=J6zlj)=a|5+FBUWGBB^@tuAP+~yd9$9E zRxeDeFH5W6m{wnD)m!|LP*<Hc@bfKRS za)qriuE^q$jzY4>yE;QX!44i$W?#heLgl zw0;r9LU{0^)le>7P!<=|ywi(o@qE9%9yTlAO=sbHy71lMBHZ3yVMZakjBwarzL;x= zDT%TPN7QnZM0pI`Id+LNV%j)+EK&1QK7@b}5CTF#2nYcoAOwVf5D)@FKnMr{As_^V zfDjM@LO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^V zfDjM@LO=)z0U;m+gn$qb0zyCt2!a0^0T&{9pxsdZt#j)w08}8>{eP>@za_pPX5Ed~ z0Ne{6Yn%fQ2sqY3cR`1ea z@2vNGyShR?uaPmre#Zg7Kd&N2hd&(dCe_&;4g`%(Qg&(1tSR~#FHEOP1Na#4$49&m ziB;LpIat}$VUl*Q?_p2XooRVtdS&e2AMiB!TB{ZQJiWB6+8$`9@b8Q?3{TTOj4j2q zcbG3e_-z)EUMi@j73T8`j@|Ti?Z7_eKj`=M7=E?S@5RdKl%~^>N070im$d`lK#+c- zVF{PDTgDvmg*~f4Wf}CVTkQS7l8a$qs9z6$5F*jm{JBG_DhSB1OE*i=HBf^3%=o|U|WuqxE$uT*sgz7=)9FITEyoK z263>zk=ym{$m<2SJ^#R!+|bJ>F5Tw;<*l_p*i-CXda&vJzgOJ#-N(jW-4!}B+c}l< z*12;JJDPXp&L28`=*vehzV?;ICvH9UQSDpu_P%rRbok=Y?|toC&c}XzxNXe`qpwZ= z;=RMC-