Accepting Ethernet Connections
Posted: Wed Jan 05, 2011 4:28 pm
				
				The accept() function is a blocking function. Is there a non-blocking function I can use to accept an ethernet connection?
steve
			steve
A community of NetBurner users gathering to discuss NetBurner hardware, software, design and projects
http://wiki.embeddedethernet.com/
Code: Select all
void TcpServerTask(void * pd)
{
    int ListenPort = (int) pd;
	// Set up the listening TCP socket
	int fdListen = listen(INADDR_ANY, ListenPort, 5);
	if (fdListen > 0)
	{
		IPADDR	client_addr;
		WORD	port;
		while(1)
		{
            // The accept() function will block until a TCP client requests
            // a connection. Once a client connection is accepting, the 
            // file descriptor fdnet is used to read/write to it. 
			iprintf( "Wainting for connection on port %d...\n", ListenPort );
			int fdnet = accept(fdListen, &client_addr, &port, 0);
			iprintf("Connected to: "); ShowIP(client_addr);
			iprintf(":%d\n", port);
			writestring(fdnet, "Welcome to the NetBurner TCP Server\r\n");
			char s[20];
			IPtoString(EthernetIP, s);
			siprintf(RXBuffer, "You are connected to IP Address %s, port %d\r\n", 
			                    s, TCP_LISTEN_PORT);
			writestring(fdnet, RXBuffer);
			while (fdnet > 0)
			{
				/* Loop while connection is valid. The read() function will return
				   0 or a negative number if the client closes the connection, so we
				   test the return value in the loop. Note: you can also use
				   ReadWithTimout() in place of read to enable the connection to
				   terminate after a period of inactivity. 
				*/
                int n = 0;
				do {
					n = read( fdnet, RXBuffer, RX_BUFSIZE );
					RXBuffer[n] = '\0';
					iprintf( "Read %d bytes: %s\n", n, RXBuffer );
				} while ( n > 0 );
				// Don't foreget to close !
				iprintf("Closing client connection: ");
				ShowIP(client_addr);
                iprintf(":%d\n", port);
				close(fdnet);
				fdnet = 0;
			} 
		} // while(1)
	} // while listen
}