/* * Copyright (c) 2001, Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the Institute nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * * Author: Adam Dunkels * * $Id: tcpecho.c,v 1.1 2001/12/12 10:00:54 adam Exp $ * * Improvements made to the comments only by Bruce Cockburn, August 14, 2003 */ #include "lwip/sys.h" #include "lwip/api.h" /*-----------------------------------------------------------------------------------*/ static void tcpecho_thread(void *arg) { struct netconn *conn, *newconn; err_t err; /* SOCKET: Create a new connection identifier (i.e. a socket). */ conn = netconn_new(NETCONN_TCP); /* BIND: Bind connection to the desired port number 7. */ netconn_bind(conn, NULL, 7); /* LISTEN: Tell the connection to go into listening mode. */ netconn_listen(conn); /* Enter the main connection request processing loop */ while(1) { /* ACCEPT: Block here until a connection request is received */ /* Any connection request will be handled using a new temporary socket */ outstr("TCPecho: listening on port 7...\n\r"); newconn = netconn_accept(conn); /* printf("TCPecho: accepted new connection %p\n", newconn); */ outstr("TCPecho: accepted new connection\n\r"); /* Process the buffers that are received over the new connection. */ if(newconn != NULL) { struct netbuf *buf; void *data; u16_t len; /* RECEIVE: Enter a while loop that processes any received buffers */ while((buf = netconn_recv(newconn)) != NULL) { outstr("TCPecho: Recved\n\r"); do { /* Retrieve the data and data_length from the received data buffer */ netbuf_data(buf, &data, &len); /* Display the received data to the terminal window */ outstrn(data,len); /* SEND: Echo the data buffer back to the sender */ err = netconn_write(newconn, data, len, NETCONN_COPY); if(err != ERR_OK) { /* printf("TCPecho: netconn_write: error \"%s\"\n", lwip_strerr(err)); */ } } while(netbuf_next(buf) >= 0); netbuf_delete(buf); } /* end while */ /*printf("Got EOF, looping\n");*/ /* Close the connection and recycle the temporary socket. */ netconn_delete(newconn); } } } /*-----------------------------------------------------------------------------------*/ void tcpecho_init(void) { sys_thread_new(tcpecho_thread, NULL, 0); } /*-----------------------------------------------------------------------------------*/