main () { SOCKET LSock, CSock; unsigned short usPort=80; int Rc; char szVer [128]; Tcp4uVer (szVer, sizeof szVer); printf ("Using %s\n", szVer); /* --- prepare a listening connection */ Tcp4uInit (); Rc = TcpGetListenSocket (& LSock, "http", & usPort, 1); if (Rc!=TCP4U_SUCCESS) { printf ("%s\n", Tcp4uErrorString(Rc)); return 0; } /* --- now listen at port */ Rc = TcpAccept (&CSock, LSock, 0); while (Rc>=TCP4U_SUCCESS) { /* now the application code. Note that you can fork or creat */ /* a new thread in order to create a multi-user server */ /* --- in this app, we listen at the opened socket */ Rc = TnReadLine (CSock, szBuf, sizeof szBuf, 60, HFILE_ERROR); if (Rc>=TCP4U_SUCCESS) printf ("%s\n", szBuf); } TcpClose (& CSock); Tcp4uCleanup (); return 0; } /* main */
// wait until GUI is connected SOCKET WaitForGuiConnection (void) { static SOCKET sListen = INVALID_SOCKET; SOCKET sDlg = INVALID_SOCKET; SOCKADDR_STORAGE saSockAddr; /* specifications pour le Accept */ int nAddrLen = sizeof saSockAddr; int Rc; do { sSettings.uConsolePort = TFTPD32_TCP_PORT; // sListen is static --> don't reopen if (sListen == INVALID_SOCKET) sListen = TcpGetListenSocket (AF_INET, "tftpd32", & sSettings.uConsolePort); #ifdef STANDALONE_EDITION // second chance (standalone edition):let the system choose its socket // pass the port nb through the sGuiSettings structure Rc = GetLastError(); if (sListen==INVALID_SOCKET && GetLastError()==WSAEADDRINUSE) { sGuiSettings.uConsolePort = 0; sListen = TcpGetListenSocket (AF_INET, NULL, & sGuiSettings.uConsolePort); } #endif if (sListen==INVALID_SOCKET) { SVC_ERROR ("can not create listening socket\nError %d", GetLastError ()); } else {HANDLE tEvents[2]; int nTriggeredEvent; // Create Socket Event to process either wake up or accept tEvents [0] = WSACreateEvent(); WSAEventSelect (sListen, tEvents[0], FD_ACCEPT); // waits either internal sollicitation or msg recpetion tEvents[1] = tThreads[TH_CONSOLE].hEv; nTriggeredEvent = WaitForMultipleObjects (2, tEvents, FALSE, INFINITE); if (nTriggeredEvent==1) { WSACloseEvent (tEvents [0]); closesocket (sListen); continue; } // an accept is ready --> Establish session sDlg = accept (sListen, (struct sockaddr *) &saSockAddr, &nAddrLen); if (sDlg == INVALID_SOCKET) { SVC_ERROR ("accept error %d", GetLastError()); } // free listening socket WSACloseEvent (tEvents [0]); // sListen socket no more necessary closesocket (sListen); sListen = INVALID_SOCKET; } // sListen OK if (sDlg==INVALID_SOCKET && tThreads[TH_CONSOLE].gRunning) Sleep (1000); } while (sDlg==INVALID_SOCKET && tThreads[TH_CONSOLE].gRunning); // detect if the client hangs and does not quit properly if (sDlg != INVALID_SOCKET) {int True=TRUE; Rc = setsockopt (sDlg, SOL_SOCKET, SO_KEEPALIVE, (char *) & True, sizeof True); if (Rc) LogToMonitor ("Error %d during setsockopt\n", GetLastError ()); } // sDlg OK return sDlg; } // WaitForGuiConnection