Beispiel #1
0
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 */   
Beispiel #2
0
// 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