I'm using tcp_listen on 1.3.2 RAW mode and have some
questions about if I'm doing everything correctly. This is being used
to configure an embedded system via a web browser. It mostly works, but
sometimes will refuse incoming connections and I have no idea why. It
always works the first time, but after that it occasionally refuses to ACK
subsequent connection requests (SYN). I'm attempting just one
connection at a time. I enabled debug and while I don't currently have
the output saved (it was difficult to replicate the issue), I didn't see any
errors. I saw the SYN come in from the remote but no processing
afterward. Anyway, here's how I'm writing the code; this is my main
concern:
listen_pcb is a global variable so I can close the listening port later.
void httpd_init(void)
{
listen_pcb = tcp_new();
tcp_bind(listen_pcb, IP_ADDR_ANY, 80);
listen_pcb = tcp_listen(listen_pcb);
tcp_accept(listen_pcb, http_accept);
}
conn_err never gets called but is defined.
err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
{
tcp_recv(pcb, http_recv);
tcp_err(pcb, conn_err);
return 0;
}
err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{
unsigned char *buf_ptr;
buf_ptr = malloc(10000);
/* do some stuff with incoming data and generate an output
string on buf_ptr */
tcp_recved(pcb, p->tot_len);
pbuf_free(p);
tcp_write(pcb, buf_ptr, strlen(buf_ptr), 0);
tcp_output(pcb);
tcp_close(pcb);
free(buf_ptr);
}
I call httpd_init, and that's all.
Is calling tcp_close immediately after tcp_output a problem? In
tcp_write, I don't specify the "copy" option because MEM_SIZE isn't
big enough and I really want to avoid increasing that to save RAM which would
be infrequently used. I have tried using tcp_sent callback to set a
flag in order determine when all data has been sent, but discovered that
waiting in http_recv for this flag doesn't work; the tcp_sent callback never
gets called while in http_recv. If all else fails, where would I look
(i.e. a breakpoint) or what debug options would be most important to track
this down?
#define TCP_MSS
1460
#define PBUF_POOL_BUFSIZE 512
#define PBUF_POOL_SIZE 12
#define TCP_WND
(TCP_MSS*4)
#define TCP_SND_BUF (TCP_MSS*4)
#define MEM_SIZE 1024
#define MEMP_NUM_PBUF 10
#define MEMP_NUM_TCP_SEG (2 *
TCP_SND_QUEUELEN)
#define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF/TCP_MSS))
#define NO_SYS
1
#define SYS_LIGHTWEIGHT_PROT 0
#define MEMP_NUM_UDP_PCB
2
#define LWIP_NETCONN
0
#define LWIP_SOCKET
0
#define LWIP_TCP
1
#define MEM_ALIGNMENT
4
#define MEMP_NUM_TCP_PCB
1
#define MEMP_NUM_TCP_PCB_LISTEN 2
#define ARP_TABLE_SIZE
1
#define IP_FRAG
0
#define MEMP_NUM_REASSDATA
0
#define LWIP_DHCP
1
#define LWIP_DNS
1
#define
DNS_TABLE_SIZE
1
#define DNS_USES_STATIC_BUF
0
#define DNS_MAX_SERVERS
1
#define ARP_QUEUEING
1
#define MEMP_NUM_ARP_QUEUE
1
|