* Possible problem in fcntl @ 2005-12-13 15:56 Filipe Cabecinhas 2005-12-13 17:50 ` linux-os (Dick Johnson) 0 siblings, 1 reply; 5+ messages in thread From: Filipe Cabecinhas @ 2005-12-13 15:56 UTC (permalink / raw) To: linux-kernel; +Cc: Nuno Lopes, Renato Crisóstomo Hi, We have written a little webserver for our CS course. But we have a problem with fcntl. We are using non-blocking sockets and per fcntl man page: On Linux, the new socket returned by accept () does not inherit file status flags such as O_NONBLOCK and O_ASYNC from the listening socket. This behaviour differs from the canonical BSD sockets implementation. Portable programs should not rely on inheritance or non-inheritance of file status flags and always explicitly set all required flags on the socket returned from accept(). We call fcntl after calling bind and listen. Then we also call fcntl for each accept'ed connection to set O_NONBLOCK: flags = fcntl(e, F_GETFL); fcntl(e, F_SETFL, flags | O_NONBLOCK); $ uname -a Linux lab9p2 2.6.11.12 #3 Sat Sep 3 20:09:17 WEST 2005 i686 Intel(R) Pentium(R) 4 CPU 2.26GHz GenuineIntel GNU/Linux $ The code is at http://mega.ist.utl.pt/~facab/proj/ (files httpd.n.[ch] have the line numbers) The line that's causing the trouble is line 377 in httpd.c. Commenting that line fixes the problem (although we think that shouldn't be necessary). However, in my laptop (with a different kernel version) it works. So, does this kernel version (2.6.11.12) has a bug with fcntl or are we doing something wrong? Thanks in advance, Filipe Cabecinhas P.S: Please CC me, because I'm not subscribed to this list. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Possible problem in fcntl 2005-12-13 15:56 Possible problem in fcntl Filipe Cabecinhas @ 2005-12-13 17:50 ` linux-os (Dick Johnson) 2005-12-13 18:30 ` Filipe Cabecinhas 0 siblings, 1 reply; 5+ messages in thread From: linux-os (Dick Johnson) @ 2005-12-13 17:50 UTC (permalink / raw) To: Filipe Cabecinhas; +Cc: linux-kernel, Nuno Lopes, Renato Crisóstomo On Tue, 13 Dec 2005, Filipe Cabecinhas wrote: > Hi, > > We have written a little webserver for our CS course. But we have a > problem with fcntl. > We are using non-blocking sockets and per fcntl man page: > On Linux, the new socket returned by accept () does not inherit file > status flags such as O_NONBLOCK and O_ASYNC from the listening socket. > This behaviour differs from the canonical BSD sockets implementation. > Portable programs should not rely on inheritance or non-inheritance of > file status flags and always explicitly set all required flags on the > socket returned from accept(). > Okay already. What is it that it doesn't do that you expect it to do? > We call fcntl after calling bind and listen. Then we also call fcntl > for each accept'ed connection to set O_NONBLOCK: > flags = fcntl(e, F_GETFL); > fcntl(e, F_SETFL, flags | O_NONBLOCK); > > $ uname -a > Linux lab9p2 2.6.11.12 #3 Sat Sep 3 20:09:17 WEST 2005 i686 Intel(R) > Pentium(R) 4 CPU 2.26GHz GenuineIntel GNU/Linux > $ > > The code is at http://mega.ist.utl.pt/~facab/proj/ > (files httpd.n.[ch] have the line numbers) > The line that's causing the trouble is line 377 in httpd.c. Commenting > that line fixes the problem (although we think that shouldn't be > necessary). > So what is it that the socket doesn't do, that you expect it should do? > However, in my laptop (with a different kernel version) it works. So, > does this kernel version (2.6.11.12) has a bug with fcntl or are we > doing something wrong? > What is it that you expect it to do? Networking exists at several levels. You may have to use setsockopt() to set some socket parameters for some kinds of sockets. The 'fact' that something worked in some previous code does not mean that the code was correct. > Thanks in advance, > Filipe Cabecinhas > > P.S: Please CC me, because I'm not subscribed to this list. > - Cheers, Dick Johnson Penguin : Linux version 2.6.13.4 on an i686 machine (5589.56 BogoMips). Warning : 98.36% of all statistics are fiction. . **************************************************************** The information transmitted in this message is confidential and may be privileged. Any review, retransmission, dissemination, or other use of this information by persons or entities other than the intended recipient is prohibited. If you are not the intended recipient, please notify Analogic Corporation immediately - by replying to this message or by sending an email to DeliveryErrors@analogic.com - and destroy all copies of this information, including any attachments, without reading or disclosing them. Thank you. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Possible problem in fcntl 2005-12-13 17:50 ` linux-os (Dick Johnson) @ 2005-12-13 18:30 ` Filipe Cabecinhas 2005-12-13 18:46 ` linux-os (Dick Johnson) 0 siblings, 1 reply; 5+ messages in thread From: Filipe Cabecinhas @ 2005-12-13 18:30 UTC (permalink / raw) To: linux-os (Dick Johnson); +Cc: linux-kernel, Nuno Lopes, Renato Crisóstomo On 12/13/05, linux-os (Dick Johnson) <linux-os@analogic.com> wrote: > So what is it that the socket doesn't do, that you expect it > should do? > When we call recv on that socket, it returns 0 and sets the string to "" (as if the the client had done an orderly shutdown (which is not true, since wget says connection refused). We were expecting it to return -1 and set errno to EAGAIN (or to return the number of bytes written and set the string to what it received). It works as expected if we don't have that (second) fcntl call. But, as the accept manpage tells us, in linux the socket returned by accept () does not inherit file status flags such as O_NONBLOCK, so we think we should call it (to be sure it has that flag). And, even if it isn't necessary, we can't tell why it's breaking (because it would just be setting a flag (that is already set )). Thanks in advance, Filipe Cabecinhas ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Possible problem in fcntl 2005-12-13 18:30 ` Filipe Cabecinhas @ 2005-12-13 18:46 ` linux-os (Dick Johnson) 2005-12-13 20:42 ` Filipe Cabecinhas 0 siblings, 1 reply; 5+ messages in thread From: linux-os (Dick Johnson) @ 2005-12-13 18:46 UTC (permalink / raw) To: Filipe Cabecinhas; +Cc: Linux kernel, Nuno Lopes, Renato Crissstomo On Tue, 13 Dec 2005, Filipe Cabecinhas wrote: > On 12/13/05, linux-os (Dick Johnson) <linux-os@analogic.com> wrote: > >> So what is it that the socket doesn't do, that you expect it >> should do? >> > > When we call recv on that socket, it returns 0 and sets the string to > "" (as if the the client had done an orderly shutdown (which is not > true, since wget says connection refused). > How do you know what wget did after the connection was refused? Didn't it close its socket when returning to the shell? > We were expecting it to return -1 and set errno to EAGAIN (or to > return the number of bytes written and set the string to what it > received). > But you said the connection was refused. Wget wouldn't have sent anything. > It works as expected if we don't have that (second) fcntl call. But, > as the accept manpage tells us, in linux the socket returned by accept > () does not inherit file status flags such as O_NONBLOCK, so we > think we should call it (to be sure it has that flag). And, even if it > isn't necessary, we can't tell why it's breaking (because it would > just be setting a flag (that is already set )). > You can always display the results of fcntl(s, F_GETFL) after changing it to see if it "works". Did you use setsockopt() to set the socket to SO_BSDCOMPAT if you are porting or copying BSD code? > Thanks in advance, > Filipe Cabecinhas > Also, since probably 90% of the Web-Pages accessed on the Internet are served by Linux servers, it is highly unlikely that Linux is doing something wrong in its socket code. FYI, there is a seperate networking list........ Cheers, Dick Johnson Penguin : Linux version 2.6.13.4 on an i686 machine (5589.56 BogoMips). Warning : 98.36% of all statistics are fiction. . **************************************************************** The information transmitted in this message is confidential and may be privileged. Any review, retransmission, dissemination, or other use of this information by persons or entities other than the intended recipient is prohibited. If you are not the intended recipient, please notify Analogic Corporation immediately - by replying to this message or by sending an email to DeliveryErrors@analogic.com - and destroy all copies of this information, including any attachments, without reading or disclosing them. Thank you. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Possible problem in fcntl 2005-12-13 18:46 ` linux-os (Dick Johnson) @ 2005-12-13 20:42 ` Filipe Cabecinhas 0 siblings, 0 replies; 5+ messages in thread From: Filipe Cabecinhas @ 2005-12-13 20:42 UTC (permalink / raw) To: linux-os (Dick Johnson); +Cc: Linux kernel, Nuno Lopes, Renato Crissstomo > How do you know what wget did after the connection was refused? > Didn't it close its socket when returning to the shell? If we have the call to fcntl, the following happens: Telnet: SYN Server: SYN, ACK T: ACK S: FIN, ACK T: FIN, ACK S: ACK There was no data exchanged. It just accepted the connection, and then finished it. Without the call to fcntl everything goes normally: T: SYN S: SYN, ACK T: ACK T: PSH, ACK (HTTP request) S: ACK S: PSH, ACK (HTTP header) T: ACK S: PSH, ACK (data) T: ACK S: FIN, ACK T: ACK T: FIN, ACK S: ACK Thanks in advance, Filipe Cabecinhas ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2005-12-13 20:42 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2005-12-13 15:56 Possible problem in fcntl Filipe Cabecinhas 2005-12-13 17:50 ` linux-os (Dick Johnson) 2005-12-13 18:30 ` Filipe Cabecinhas 2005-12-13 18:46 ` linux-os (Dick Johnson) 2005-12-13 20:42 ` Filipe Cabecinhas
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.