Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT sources DOT redhat DOT com Delivered-To: mailing list cygwin AT sources DOT redhat DOT com Date: Mon, 10 Sep 2001 13:30:34 -0400 (EDT) From: Omid Roshan-Afshar To: egor duda Subject: Re: recv() blocking for non-blocking socket In-Reply-To: <9436244126.20010910195549@logos-m.ru> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Here is a simple version of what I'm doing: /* Start of source code */ #define FAIL (1) { int sock_handle; char errmsg[1024]; int sockAddrSize; struct sockaddr_in serverAddr; char *address; int port; int true; true = 1; address = "127.0.0.1"; port = 5001; sock_handle = socket(AF_INET, SOCK_STREAM, 0); if (sock_handle == -1) { if (errmsg!=NULL) sprintf(errmsg, "socket(): %s", strerror(errno)); return FAIL; } sockAddrSize = sizeof(struct sockaddr_in); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons((unsigned short)port); if ( (serverAddr.sin_addr.s_addr = inet_addr(address)) == ((unsigned long)(-1)) ) { struct hostent *he = gethostbyname(address); if (!he) { if (errmsg!=NULL) strcpy(errmsg, "cannot resolve address"); return FAIL; } serverAddr.sin_addr.s_addr = (he->h_addr_list[0][0] * (256*256*256)) + (he->h_addr_list[0][1] * (256*256)) + (he->h_addr_list[0][2] * (256)) + (he->h_addr_list[0][3]); } if (connect(sock_handle, (struct sockaddr *)&serverAddr, sockAddrSize) == -1) { if (errmsg!=NULL) sprintf(errmsg, "connect(): %s", strerror(errno)); return FAIL; } if (ioctl(sock_handle, FIONBIO, &true) != 0) { if (errmsg!=NULL) sprintf(errmsg, "ioctl(): %s", strerror(errno)); return FAIL; } while (1) { char buf[4]; int n; int buf_size = 4; n = recv(sock_handle, buf, buf_size, 0); prnitf("recieved %u bytes\n", n); } } /* End of source code */ -Omid On Mon, 10 Sep 2001, egor duda wrote: > Hi! > > Monday, 10 September, 2001 Omid Roshan-Afshar omid AT acorn-networks DOT com wrote: > > ORA> I've looked through the archive, and I found > ORA> some discussion about using accept() on non-blocking > ORA> sockets, but none on recv(). If someone could spot > ORA> any stupid errors in the following code, that would > ORA> be great. > > ORA> { > ORA> int true = 1; > ORA> if (ioctl(sock_handle, FIONBIO, &true) != 0) { > ORA> if (errmsg!=NULL) > ORA> sprintf(errmsg, "ioctl(): %s", strerror(errno)); > ORA> return GFAPI_ERR_FAIL; > ORA> } > ORA> } > > ORA> I call recv after I do this and it blocks. I *think* I'm > ORA> doing the appropriate thing to make the socket non-blocking. > > can you provide a small self-contained testcase? > > it's impossible to conclude from your code snippet what kind of socket > you are using, how exactly recv() is called, etc. > > Egor. mailto:deo AT logos-m DOT ru ICQ 5165414 FidoNet 2:5020/496.19 > -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Bug reporting: http://cygwin.com/bugs.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/