static FskErr KprSocketListenerNew(KprSocket owner, int ip, int port, KprSocketListener *it) { KprSocketListener self = NULL; FskErr err; FskSocket skt = NULL; bailIfError(KprMemPtrNewClear(sizeof(KprSocketListenerRecord), &self)); bailIfError(FskNetSocketNewTCP(&skt, true, "KprSocketListener")); FskNetSocketReuseAddress(skt); FskNetSocketMakeNonblocking(skt); bailIfError(FskNetSocketBind(skt, ip, port)); bailIfError(FskNetSocketGetLocalAddress(skt, NULL, &port)); self->owner = owner; self->ip = ip; self->port = port; self->socket = skt; skt = NULL; FskListAppend(&owner->listeners, self); if (it) *it = self; bail: FskNetSocketClose(skt); if (err) { KprSocketListenerDispose(self); } return err; }
FskHTTPServerListener FskHTTPServerListenerNew(FskHTTPServer http, int port, char *interfaceName) { FskHTTPServerListener listener; FskErr err; FskSocket skt; FskNetInterfaceRecord *ifc = NULL; FskInstrumentedTypePrintfDebug(&gFskHTTPServerTypeInstrumentation, "httpServerListenerNew - interfaceName: %s\n", interfaceName); err = FskMemPtrNewClear(sizeof(FskHTTPServerListenerRecord), (FskMemPtr*)&listener); BAIL_IF_ERR(err); listener->http = http; listener->port = port; listener->ifcName = FskStrDoCopy(interfaceName); err = FskNetSocketNewTCP(&skt, true, "HTTP Server"); if (err) { FskInstrumentedItemSendMessage(listener->http, kFskHTTPInstrMsgErrString, "listener socket create failed."); FskInstrumentedTypePrintfDebug(&gFskHTTPServerTypeInstrumentation, "httpServerListenerNew - creating socket failed: %d\n", err); BAIL(kFskErrNoMoreSockets); } FskNetSocketReuseAddress(skt); ifc = FskNetInterfaceFindByName(listener->ifcName); if ((NULL == ifc) || (kFskErrNone != (err = FskNetSocketBind(skt, ifc->ip, listener->port)))) { FskNetSocketClose(skt); FskInstrumentedTypePrintfDebug(&gFskHTTPServerTypeInstrumentation, "httpServerListenerNew - bind failed: %d port: %d\n", err, listener->port); listener->http->stats.connectionsAborted++; if (listener->http->callbacks) err = doCallCondition(listener->http->callbacks->serverCondition, listener->http, kFskHTTPConditionNoSocket, listener->http->refCon); goto bail; } listener->skt = skt; FskNetSocketMakeNonblocking(skt); FskListAppend((FskList*)&listener->http->listeners, listener); FskInstrumentedTypePrintfDebug(&gFskHTTPServerTypeInstrumentation, "httpServerListenerNew - about to listen\n"); FskNetSocketListen(skt); FskThreadAddDataHandler(&listener->dataHandler, (FskThreadDataSource)skt, (FskThreadDataReadyCallback)httpServerListenerAcceptNewConnection, true, false, listener); FskInstrumentedItemSendMessage(listener->http, kFskHTTPInstrMsgNowListening, listener); bail: FskNetInterfaceDescriptionDispose(ifc); if (err) { FskInstrumentedItemSendMessage(listener->http, kFskHTTPInstrMsgFailedListener, listener); FskMemPtrDisposeAt((void**)&listener); } return listener; }
FskErr KprCoAPClientNew(KprCoAPClient *it, KprCoAPClientCallbacks *callbacks, void *refcon) { FskErr err = kFskErrNone; KprCoAPClient self = NULL; FskSocket socket = NULL; KprCoAPReceiver receiver = NULL; KprCoAPReceiverCallbacks receiverCallback = { KprCoAPClient_receiveCallback, KprCoAPClient_errorCallback, }; bailIfError(KprMemPtrNewClear(sizeof(KprCoAPClientRecord), &self)); bailIfError(FskNetSocketNewUDP(&socket, "KprCoAPClient")); bailIfError(FskNetSocketBind(socket, -1, 0)); bailIfError(KprCoAPReceiverNew(&receiver, socket, &receiverCallback, self)); self->socket = socket; self->receiver = receiver; self->messageId = FskRandom(); self->autoToken = false; self->nextTokenBytes = 1; self->callbacks = *callbacks; self->refcon = refcon; *it = self; FskDebugStr("CoAP Client created: %p", self); bail: if (err) { FskNetSocketClose(socket); KprCoAPReceiverDispose(receiver); KprCoAPClientDispose(self); } return err; }