lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [lwip-users] RAW - tcpip_callback causes delays


From: address@hidden
Subject: Re: [lwip-users] RAW - tcpip_callback causes delays
Date: Wed, 17 Jun 2009 15:39:39 +0200
User-agent: Thunderbird 2.0.0.21 (Macintosh/20090302)

From reading the code, the cause of the delay is that you don't call tcp_output() after calling tcp_write(). tcp_write() only enqueues without sending. The data is then sent later by a TCP timer (which is the reason for the relatively exact delay of 200 ms). (BTW: Variant 2 is the correct way, you don't need to use tcp_callback).

Simon


ncoage wrote:
Hi,

I'm having troubles with tcp server based on RAW API. I'm using tcpip_callback 
function, which causes delays (about 200ms). When I call directly tcp_write 
function everything is ok (no delays). I wrote simple server to illustrate my 
problem:

// -----------------------------------------------------------------
#include "lwip/opt.h"
#include "lwip/mem.h"
#include "lwip/tcp.h"
#include "lwip/tcpip.h"

void tcpSendReply(void *ctx)
{
        unsigned char data[10] = "REPLY!!!\r\n";
        struct tcp_pcb *pcb = ctx;
        tcp_write(pcb, data, sizeof(data), TCP_WRITE_FLAG_COPY);
}

err_t callbackServerRecv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t 
err)
{
        if (err == ERR_OK && p != NULL)
        {
                tcp_recved(pcb, p->tot_len);

                // Variant 1
                //tcpip_callback_with_block(tcpSendReply, pcb, 0);
                // Variant 2
                tcpSendReply(pcb);

                pbuf_free(p);
        }
        else if (err == ERR_OK && p == NULL)
        {
                tcp_close(pcb);
        }
        return ERR_OK;
}

err_t callbackServerAccept(void *arg, struct tcp_pcb *newpcb, err_t err)
{
        tcp_recv(newpcb, callbackServerRecv);
        return ERR_OK;
}

void callbackServerInit()
{
        struct tcp_pcb *pcb;
        pcb = tcp_new();
        tcp_bind(pcb, IP_ADDR_ANY, 9923);
        pcb = tcp_listen(pcb);
        tcp_accept(pcb, callbackServerAccept);
}
// -----------------------------------------------------------------

It will be great if someone could test this server and check results in 
Wireshark (Variant 1 and 2 - see code). All you need to do is paste above code 
to your project and call callbackServerInit() function. Then on PC run 'telnet 
x.x.x.x 9923'. Server replies when you type any character.

I attach Wireshark capture files (Variant 1 i 2).

Best regards
------------------------------------------------------------------------

_______________________________________________
lwip-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/lwip-users





reply via email to

[Prev in Thread] Current Thread [Next in Thread]