int netTcpConnect(char *err, char *addr, int port){ int so; struct sockaddr_in sa; if ((so = netCreateSocket(err, AF_INET)) == -1) return -1; sa.sin_family = AF_INET; sa.sin_port = htons(port); if (inet_aton(addr, &sa.sin_addr) == 0) { struct hostent *he; he = gethostbyname(addr); if (he == NULL) { netPrintError(err, "can't resolve: %s", addr); close(so); return -1; } memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr)); } if (netSetNonBlock(err, so) == -1) { return -1; } if (connect(so, (struct sockaddr*)&sa, sizeof(sa)) == -1) { if (errno = EINPROGRESS) return so; netPrintError(err, "connect: %s", strerror(errno)); close(so); return -1; } return so; }
int main(int argc, char** argv) { const char* address = "127.0.0.1"; int port = 1234; int outgoingSocket; // register callbacks netRegisterReadCallback(onRead); netRegisterWriteCallback(onWrite); netRegisterErrorCallback(onError); // start network CHECK(netStartup()); // create outgoing connection to the server socket CHECK(netCreateSocket(&outgoingSocket)); // connect CHECK(netConnect(outgoingSocket, address, port)); // process events while (1) { CHECK(netWait(1000)); printf("tick\n"); } // shutdown network CHECK(netCleanup()); return 0; }
// Start the listening socket for the telnet console server. void telnetStart(JsNetwork *net) { // create the listening socket printf("tnSrv: creating...\n"); int sock = netCreateSocket(net, 0, PORT, NCF_NORMAL, NULL); if (sock == 0) { printf("tnSrv: cannot create listening socket\n"); return; } tnSrv.sock = sock; printf("tnSrv: started sock=%d\n", sock); }
// Connect this connection/socket void clientRequestConnect(JsNetwork *net, JsVar *httpClientReqVar) { // Have we already connected? If so, don't go further if (jsvGetIntegerAndUnLock(jsvObjectGetChild(httpClientReqVar, HTTP_NAME_SOCKET, 0))>0) return; SocketType socketType = socketGetType(httpClientReqVar); JsVar *options = jsvObjectGetChild(httpClientReqVar, HTTP_NAME_OPTIONS_VAR, false); unsigned short port = (unsigned short)jsvGetIntegerAndUnLock(jsvObjectGetChild(options, "port", 0)); char hostName[128]; JsVar *hostNameVar = jsvObjectGetChild(options, "host", 0); if (jsvIsUndefined(hostNameVar)) strncpy(hostName, "localhost", sizeof(hostName)); else jsvGetString(hostNameVar, hostName, sizeof(hostName)); jsvUnLock(hostNameVar); uint32_t host_addr = 0; networkGetHostByName(net, hostName, &host_addr); if(!host_addr) { jsError("Unable to locate host\n"); // As this is already in the list of connections, an error will be thrown on idle anyway jsvObjectSetChildAndUnLock(httpClientReqVar, HTTP_NAME_CLOSENOW, jsvNewFromBool(true)); jsvUnLock(options); netCheckError(net); return; } NetCreateFlags flags = NCF_NORMAL; #ifdef USE_TLS if (socketType & ST_TLS) { flags |= NCF_TLS; if (port==0) port = 443; } #endif if (port==0) port = 80; int sckt = netCreateSocket(net, host_addr, port, flags, options); if (sckt<0) { jsError("Unable to create socket\n"); // As this is already in the list of connections, an error will be thrown on idle anyway jsvObjectSetChildAndUnLock(httpClientReqVar, HTTP_NAME_CLOSENOW, jsvNewFromBool(true)); } else { jsvObjectSetChildAndUnLock(httpClientReqVar, HTTP_NAME_SOCKET, jsvNewFromInteger(sckt+1)); } jsvUnLock(options); netCheckError(net); }
void serverListen(JsNetwork *net, JsVar *server, int port) { JsVar *arr = socketGetArray(HTTP_ARRAY_HTTP_SERVERS, true); if (!arr) return; // out of memory jsvObjectSetChildAndUnLock(server, HTTP_NAME_PORT, jsvNewFromInteger(port)); int sckt = netCreateSocket(net, 0/*server*/, (unsigned short)port, NCF_NORMAL, 0 /*options*/); if (sckt<0) { jsError("Unable to create socket\n"); jsvObjectSetChildAndUnLock(server, HTTP_NAME_CLOSENOW, jsvNewFromBool(true)); } else { jsvObjectSetChildAndUnLock(server, HTTP_NAME_SOCKET, jsvNewFromInteger(sckt+1)); // add to list of servers jsvArrayPush(arr, server); } jsvUnLock(arr); }
int netStartServer(char *err, int port, char *bindaddr) { int so; struct sockaddr_in sa; /*struct sockaddr_in sa;*/ if ((so = netCreateSocket(err, AF_INET)) == -1) return -1; //netSetSocketReuse(err, so); memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(port); sa.sin_addr.s_addr = htonl(INADDR_ANY); if (bindaddr && inet_aton(bindaddr, &sa.sin_addr) == 0) { netPrintError(err, "invalid bind address"); close(so); return -1; } if (netBind(err, so, (struct sockaddr*)&sa) == -1) return -1; if (netListen(err, so, (struct sockaddr*)&sa) == -1) return -1; return so; }