Hi,
those are two different things you are seeing:
The lwip_close function does two things:
- close the connection
- free all pbufs that are received but not yet processed.
The first is what SO_LINGER would change (waiting to output all data vs.
telling the stack to close and letting it output in the background).
The latter is necessary to prevent memory leaks and can't be changed! If
you get stuck there it obviously is a bug in lwIP or your port.
(I'd suggest it is in your port since noone else reported such a
problem, but convince me of the opposite! ;-)
You could take a look at the contents of conn->recvmbox before calling
sys_arch_mbox_fetch.
A problem in your port could possibly be your implementation of
sys_arch_timeouts() (in sys_arch.c). It should return a pointer
that is unique to each thread. Did you port yourself or use an existing
(working) port?
Simon
________________________________
From:
[EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED]
On Behalf Of [EMAIL PROTECTED]
Sent: Friday, July 06, 2007 2:37 PM
To: Mailing list for lwIP users
Subject: RE: [lwip-users] Problem with lwip_close()
Hello again,
the Version I am using is V. 1.1.1
And the lwip_close function gets stuck exactly in the next piece
of code inside netconn_delete():
err_t
netconn_delete(struct netconn *conn)
{
...
/* Drain the recvmbox. */
if (conn->recvmbox != SYS_MBOX_NULL) {
while (sys_arch_mbox_fetch(conn->recvmbox, &mem, 1) !=
SYS_ARCH_TIMEOUT) {
if (conn->type == NETCONN_TCP) {
if(mem != NULL)
pbuf_free((struct pbuf *)mem);
} else {
netbuf_delete((struct netbuf *)mem);
}
} ->It does
not get off the while. It gets stuck, and if I stop the debugger I see
that the execution has gone along some other files reaching the
sys_mbox_free(conn->recvmbox); //main loop in
tcpip.c.
conn->recvmbox = SYS_MBOX_NULL;
}
...
}
After seeing this, I think that what the lwip_close() function
does is close the socket gracefully getting blocked until the whole
handshake has been properly completed. Am I right??
If this is ok, is there any possibility of implementing a linger
close?
Thank you very much for your attention.
Borja.
"Goldschmidt Simon" <[EMAIL PROTECTED]>
Enviado por: [EMAIL PROTECTED]
06/07/2007 12:32
Por favor, responda a
Mailing list for lwIP users <[email protected]>
Para
"Mailing list for lwIP users" <[email protected]>
cc
Asunto
RE: [lwip-users] Problem with lwip_close()
> I have been studying how to make a linger close of a socket in
lwip.
> First of all, I have used the standard lwip_close() function
as it is,
> an I have noticed that it gets stucked in the
"netconn_delete(sock->conn);"
> statement. I suppose that here it will wait for the closure
handshake
to
> get completed or something like that.
>
That's strange. Can you tell us which version of lwIP you're
using and
do
you know why it got stuck? (e.g. memory problems?)
> Later, I tried to see how to use the SO_LINGER option. And I
saw that
this
> option is listed in sockets.h but I cannot find it in
sockets.c. I had
a
> look in lwip_setsockopt(), but I did not find the SO_LINGER
definition.
> In addition, I saw that many other options are unimplemented.
Then, my
> question is: Can a linger close be implemented under lwip??
How??
Usingo the
> SO_LINGER option in setsockopt ???
I don't know if I remember correctly, but I think the last
SO_LINGER
implementation
wasn't working correctly and because of that, the code was
removed.
I is one point of the lwIP todo-list to implement SO_LINGER,
though.
Simon
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users
_______________________________________________
lwip-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/lwip-users