Return to BSD News archive
Newsgroups: comp.unix.bsd Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!uhunix.uhcc.Hawaii.Edu!newsham From: newsham@uhunix.uhcc.Hawaii.Edu (Tim Newsham) Subject: select on non-blocking open Message-ID: <CJptvz.GIu@news.Hawaii.Edu> Sender: news@news.Hawaii.Edu Organization: University of Hawaii Date: Sun, 16 Jan 1994 09:19:10 GMT Lines: 85 Hi, I am trying to open a socket in non-blocking mode so it returns right away and later test if the connection has been made. On HP-UX 'connect()' man page it says if the socket is O_NDELAY then you select for writing to test if a connection has been made. The man pages on sunos are not so clear but seem to imply you should select for writing as well. I have tried the following program, it tries two connections, the first should pass and the second should fail. This works fine on HP-UX 8.0 and Solaris (dunno version) but fails under both SunOS4.1.3 and Ultrix (dunno version). It appears that the two BSD machines behave identically. What is the proper way for doing this? --- test3.c ----- /* test socket in non-blocking w/ connect() and select() */ #define ADDR "128.171.60.1" /* change me */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <fcntl.h> #include <signal.h> #include <errno.h> int done=0; handler(i) int i; { done=1; printf("Got signal\n"); } try(port) int port; { struct sockaddr_in a; struct fd_set wr; int s; a.sin_family= AF_INET; a.sin_addr.s_addr = inet_addr(ADDR); a.sin_port = htons(port); s = socket(AF_INET,SOCK_STREAM,0); if(s<0) { perror("socket"); return; } if(fcntl(s,F_SETFL,O_NDELAY)<0) { perror("fcntl"); return; } if(connect(s,&a,sizeof(a)) < 0) { perror("connect"); /* return; */ } signal(SIGALRM,handler); alarm(5); FD_SET(s,&wr); if(select(32,0,&wr,0,0) < 0) { perror("select"); return; } else { if(FD_ISSET(s,&wr)) printf("Connected to %d\n",port); } alarm(0); close(s); } main() { try(23); try(12345); printf("done.\n"); }