adding in sample code
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
||||||
@@ -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 `<dns_sd.h>`.
|
||||||
|
|
||||||
|
|
||||||
|
# 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.
|
||||||
Executable
BIN
Binary file not shown.
@@ -0,0 +1,51 @@
|
|||||||
|
#include <cstring>
|
||||||
|
#include <dns_sd.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
#include <cstdio>
|
||||||
|
#include <dns_sd.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
Executable
BIN
Binary file not shown.
Reference in New Issue
Block a user