On Sat, 2007-07-14 at 19:24 +0200, Louis Filasky wrote: > First, we
couldn t send more than around 8000 bytes of data.> This was fixed by
changing the argument in the tcp_write> function by choosing>
not to copy before sending the data. > Can I just check that you're
doing something to make sure the data you> send are preserved until you
get the tcp_sent() callback? By specifying> not to copy, you're saying
the data you pass to tcp_write() are static> until the callback is made
to say the stack has finished with those> data. It's not just a magic
switch to make things faster! Hi everyone,
Thanks to your suggestion, I was able to improve my code but I determined what
was wrong. In EDK, you are able to change some
values for lwIP using a file xiledk_opt.h. The thing if that if you look at
that file in the EDK install directory where the lwIP sources lies,
it is empty but the lwipopt.h includes th e xiled_opt.h. Then I went in the
compiled sources of the project and you can see that
this file is no longer empty and redefines suche variables as MEMORY_SIZE or
SND_BUF.
Changing the MEMORY_SIZE, I was able to send larger files. I set it up to the
maximum file size I could send so now when I ask the server
to change a large file, the client is at least receiving data and creating the
file which it was not doing before that.
Following Kieran suggestion, I use now the argument 1 when I call tcp_write.
However, now I am limited by the size of the send buffer.
Whatever the size I choose, if I try to send a file larger than the send
buffer, it will only send the maximum send buffer size.
Now in my send_data() function, I handle when the data is bigger than the send
buffer:
void send_data(struct tcp_pcb *pcb, struct connection_state *cs){ u16_t len;
err_t err; /* We cannot send more data than space available in the send
buffer.*/ if(tcp_sndbuf(pcb) < (cs->left)) { len = tcp_sndbuf(pcb); } /*
Otherwise, the length is equal to the size of the data to be sent */ else {
len = cs->left; } err = tcp_write(pcb, cs->data, len, 1); /* Queue
the data to be sent, if tcp_write does not send back ERR_OK, force the data
transfer. */ if(ERR_OK==err) { cs->data += len; cs->left -= len; }
else if(err==ERR_MEM) { tcp_output(pcb); }
/* If the data to be send is smaller than the send buffer size, then force
the data transfer to speed it up. */ if(cs->left == 0) { tcp_output(pcb);
} }
If I try to send a file of 50.000 bytes and let's say the sendbuffer max size
is 40960, the left variable is set to be 9040.
But in my server_sent callback function, if left is > 0, it should call again
send_data:
err_t server_sent(void *arg, struct tcp_pcb *pcb, u16_t len){ struct
connection_state *cs; cs = arg; xil_printf("tets %d\r\n", cs->left); //Once
the server has received ACK from client that data has been successfully
transmitted, //check if there is still some more data to send and initiate
transmission. if(cs->left >0) { send_data(pcb, cs); xil_printf("test2");
} return ERR_OK;
}
But when I send any data larger than the sendbuffer size, it never goes in the
if condition and the xil_printf before the if condition is always
displaying 0.
Now, in my server_received callback function, i have the followings:
err_t server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err){
struct connection_state *cs; if(err == ERR_OK && p!=NULL) { //Inform TCP
that received data is being handled: tcp_recved(pcb, p->tot_len);
processCommand(p, pcb, cs); tcp_sent(pcb, server_sent); } else pbuf_free(p);
return ERR_OK;
With processCommand being a function which analyzes the command received from
the client and send the corresponding data. So the last
line of the function is actually a call to send_data().
I must be doing something wrong, so if anyone has got a hint, thanks!
Antoine.
_________________________________________________________________
Windows Live Messenger vous offre 30 nouvelles émoticônes gratuites, installées
directement dans votre Messenger !
http://www.emoticones-messenger.fr/_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users