Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Date: Wed, 29 Sep 2004 17:44:09 -0500 From: Brian Ford Reply-To: cygwin AT cygwin DOT com To: Stefan Mahr cc: cygwin AT cygwin DOT com Subject: Re: select call does block unless data arrives at socket (when waiting for serial port and ip socket) In-Reply-To: <415B246F.5010103@gmx.de> Message-ID: References: <415B246F DOT 5010103 AT gmx DOT de> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-IsSubscribed: yes On Wed, 29 Sep 2004, Stefan Mahr wrote: > I want to use select() to wait for a serial port and a ip socket. > Following problem: > If data arrives the serial port, select() works as aspected and returns 1. > If data arrives the ip socket, select() doesn't return. > If data arrives the serial port and before there was some data at the ip > socket, > select() returns 2. Both file descriptors are set in "fd_set input", and > all data > can be read by the next functions. > > I am using the cygwin1.dll version 1.5.11 with Windows XP. > (The same problem with previous versions of cygwin1.dll.) > > Sample sourcecode: > /*********************************************/ > > /* ipserial.c */ > #include > #include > #include > #include > #include > #include > #include > #include > #include > #include > > /*****************************************************************************/ > > #define HOSTNAME "localhost" > #define HOSTMODEPORT 5000 > #define MAXDATASIZE 256 > #define SERIALPORT "com5" If you want POSIX behavior from the serial port (ie. termios, etc.), please see: http://cygwin.com/cygwin-ug-net/using-specialnames.html#AEN825 and use the proper POSIX device (ie. /dev/ttyS4; /dev/com5 may also work, but is not suggested). >/*****************************************************************************/ > > int open_port(void) > { > int fd; > > fd = open(SERIALPORT, O_RDWR | O_NOCTTY); > if (fd == -1) { > perror("open serial port"); > } else > fcntl(fd, F_SETFL, 0); What are you trying to accomplish here? One would normally do a get, modify, set like: { int flags = fcntl(fd, F_GETFL); if (flags < 0 || fcntl(fd, F_SETFL, flags|O_NONBLOCK) < 0) { perror("fcntl(O_NONBLOCK) failed"); exit(1); } } > return (fd); > } > > /*****************************************************************************/ > > int init_port(int fd) > { > struct termios options; > > tcgetattr(fd, &options); > > cfsetispeed(&options, B19200); > cfsetospeed(&options, B19200); > > options.c_cflag |= (CLOCAL | CREAD); > options.c_cflag &= ~CSTOPB; > options.c_cflag &= ~CRTSCTS; > options.c_iflag &= ~(IXON | IXOFF | IXANY); > > //cfmakeraw(&options); > options.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); > options.c_oflag &= ~OPOST; > options.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); > options.c_cflag &= ~(CSIZE|PARENB); > options.c_cflag |= CS8; > > options.c_cc[VMIN] = 0; > options.c_cc[VTIME] = 10; > > tcsetattr(fd, TCSANOW, &options); > > return(0); > } > > /*****************************************************************************/ > > int main(void) > { > int err; > int numbytes; > > char serialbuf[MAXDATASIZE]; > char socketbuf[MAXDATASIZE]; > > int serialfd,socketfd; > int max_fd; > fd_set input; > > struct hostent *he; > struct sockaddr_in their_addr; > > if ((he=gethostbyname(HOSTNAME)) == NULL) { > perror("gethostbyname"); > exit(1); > } > if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { > perror("socket"); > exit(1); > } > > their_addr.sin_family = AF_INET; > their_addr.sin_port = htons(HOSTMODEPORT); > their_addr.sin_addr = *((struct in_addr *)he->h_addr); > memset(&(their_addr.sin_zero), '\0', 8); ^ sizeof(their_addr.sin_zero) ;-)? You might also try poll, or debugging it yourself as CGF suggested. I don't have time to look into it right now :-(. Sorry. Since the problem appears to be with the socket, can you get two sockets to have this behavior? -- Brian Ford Senior Realtime Software Engineer VITAL - Visual Simulation Systems FlightSafety International the best safety device in any aircraft is a well-trained pilot... -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/