The code looks odd. Why would you put tcp_listen and tcp_accept in an
infinite loop?

The call sequence should be (for 1.4.1)

tcp_bind
tcp_listen
tcp_accept

while(1)
{
    ethernetif_input     // Look for incoming packets.
    sys_check_timeouts // TCP timers.
}





On Wed, Oct 21, 2015 at 2:54 PM, enricoG <[email protected]>
wrote:

> Hi, I've a big problem with echo example running in my LPC1788
> (DK-57VTS-LPC1788 FDI). I'm using uEZ 2.1 framework and this is my code
> (taken here: http://www.ultimaserial.com/avr_lwip_tcp.html) :
>
>
> #include <sockets.h>
> #include <tcp.h>
> #include <uEZ.h>
> #include <http.h>
> #include <init.h>
> #include <lwip/ip_addr.h>
> #include "lwip/sys.h"
> #include "lwip/api.h"
>
> char mydata[1024];
> static struct tcp_pcb *ptel_pcb;
> int err;
>
>
> #include "lwip/debug.h"
> #include "lwip/stats.h"
> #include "lwip/tcp.h"
>
>
> static struct tcp_pcb *echo_pcb;
>
> enum echo_states
> {
>   ES_NONE = 0,
>   ES_ACCEPTED,
>   ES_RECEIVED,
>   ES_CLOSING
> };
>
> struct echo_state
> {
>   u8_t state;
>   u8_t retries;
>   struct tcp_pcb *pcb;
>   /* pbuf (chain) to recycle */
>   struct pbuf *p;
> };
>
> struct ip_addr  ipaddr_local;
> struct ip_addr  ipmask_local;
>
> /*
>                 IP4_ADDR(&ipaddr_local, 192,168,1,3);
>                 IP4_ADDR(&ipmask_local, 255,255,255,0);
>
>     err = tcp_bind(echo_pcb, &ipaddr_local, 7);
>
> */
>
>
> err_t echo_accept(void *arg, struct tcp_pcb *newpcb, err_t err);
> err_t echo_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t
> err);
> void echo_error(void *arg, err_t err);
> err_t echo_poll(void *arg, struct tcp_pcb *tpcb);
> err_t echo_sent(void *arg, struct tcp_pcb *tpcb, u16_t len);
> void echo_send(struct tcp_pcb *tpcb, struct echo_state *es);
> void echo_close(struct tcp_pcb *tpcb, struct echo_state *es);
>
> static void close_conn(struct tcp_pcb *pcb){
>       tcp_arg(pcb, NULL);
>       tcp_sent(pcb, NULL);
>       tcp_recv(pcb, NULL);
>       tcp_close(pcb);
> }
>
> static err_t echo_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p,
> err_t
> err){
>       int i;
>       int len;
>       char *pc;
>
>       if (err == ERR_OK && p != NULL) {
>             /* Inform TCP that we have taken the data. */
>             tcp_recved(pcb, p->tot_len);
>
>             //pointer to the pay load
>             pc=(char *)p->payload;
>
>             //size of the pay load
>             len =p->tot_len;
>
>             //copy to our own buffer
>             for (i=0; i<len; i++)mydata[i]= pc[i];
>
>              //Close TCP when receiving &quot;X&quot;
>             if (mydata[0]=='X')close_conn(pcb);
>
>            //Free the packet buffer
>             pbuf_free(p);
>
>             //check output buffer capacity
>             if (len >tcp_sndbuf(pcb)) len= tcp_sndbuf(pcb);
>             //Send out the data
>             err = tcp_write(pcb, mydata, len, 0);
>             tcp_sent(pcb, NULL); /* No need to call back */
>       } else {
>             pbuf_free(p);
>       }
>
>       if (err == ERR_OK && p == NULL) {
>             close_conn(pcb);
>       }
>       return ERR_OK;
> }
>
> static err_t echo_accept(void *arg, struct tcp_pcb *pcb, err_t err){
>         LWIP_UNUSED_ARG(arg);
>         LWIP_UNUSED_ARG(err);
>         tcp_setprio(pcb, TCP_PRIO_MIN);
>         tcp_recv(pcb, echo_recv);
>         tcp_err(pcb, NULL); //Don't care about error here
>         tcp_poll(pcb, NULL, 4); //No polling here
>         return ERR_OK;
> }
>
>
> unsigned int _ServerTask(T_uezTask aMyTask, void *aParameters){
>         struct tcp_pcb *ptel_pcb;
>         ptel_pcb = tcp_new();
>         IP4_ADDR(&ipaddr_local, 192,168,1,3);
>         IP4_ADDR(&ipmask_local, 255,255,255,0);
>
>         err = tcp_bind(echo_pcb, &ipaddr_local, 7);
>
>         while (1){
>                                 ptel_pcb = tcp_listen(ptel_pcb);
>                                 tcp_accept(ptel_pcb, echo_accept);
>         }
> }
>
>
> void server_setup(){
>         T_uezTask      server_task;
>         lwip_init();
>
>         if (!(UEZTaskCreate((T_uezTaskFunction)_ServerTask, "ServerTask",
> 4096, 0,
> UEZ_PRIORITY_LOW, &server_task) == UEZ_ERROR_NONE)) {
>                 printf("ERROR\n");
>         }
> }
>
>
> What is wrong? Does exists a simple example test running on uEZ or
> externally?
>
>
>
> --
> View this message in context:
> http://lwip.100.n7.nabble.com/LWIP-on-LPC1788-uEZ-2-1-tp25235.html
> Sent from the lwip-users mailing list archive at Nabble.com.
>
> _______________________________________________
> lwip-users mailing list
> [email protected]
> https://lists.nongnu.org/mailman/listinfo/lwip-users
>
_______________________________________________
lwip-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to