FskErr KprCoAPClientSendRequest(KprCoAPClient self, KprCoAPMessage message) { FskErr err = kFskErrNone; const char *host = message->host; UInt16 port = message->port; KprCoAPClientResolver dest = self->resolvers; while (dest) { if (port == dest->port && FskStrCompareCaseInsensitive(host, dest->host) == 0) break; dest = dest->next; } if (dest) { if (KprCoAPClientResolverIsResolved(dest)) { err = KprCoAPClientStartRequest(self, dest->ipaddr, port, message); } else { err = KprCoAPClientResolverQueueMessage(dest, message); } } else { bailIfError(KprCoAPClientResolverNew(&dest, self, host, port, message)); FskListAppend(&self->resolvers, dest); } bail: return err; }
static void KprCoAPClientResolverResolved(FskResolver rr) { FskErr err = kFskErrNone; KprCoAPClientResolver self = (KprCoAPClientResolver)rr->ref; KprCoAPMessageQueue entry; self->resolver = NULL; bailIfError(rr->err); self->ipaddr = rr->resolvedIP; FskTimeGetNow(&self->resolvedAt); entry = self->waiting; while (entry) { KprCoAPMessageQueue next = entry->next; KprCoAPMessage message = entry->message; bailIfError(KprCoAPClientStartRequest(self->client, self->ipaddr, self->port, message)); entry = next; } bail: if (err) { if (self->constructed) { KprCoAPClientReportError(self->client, err, "dns resolve error"); } else { self->err = err; } } }