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 From: "Peter Stephens" To: Subject: recv and errno during a connection reset/closed by peer Date: Fri, 25 Mar 2005 01:23:00 -0500 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit I am writing a program to handle messages on a TCP/CONNECTION based setup. I have verified that I can receive the messages I want, both blocking and non-blocking. I want to be in non-blocking mode. When in blocking mode I can detect a loss of the connection simply by waiting for a return of '0' from recv. Easy enough. When in non-blocking mode I thought I would be able to get a return from recv of '-1' and then check errno, but it never seems to be anything but '11', or EAGAIN. This seems to be true whether I MSG_PEEK or not. I have included my code below. The intention is that for recv returns greater than zero, there is a message and I should process it and get ready for the next one. For recv returns of '0' I should do nothing and for recv returns of '-1' I should handle per errno. Seems easy enough, but no matter what I have tried I can only get a recv return of EAGAIN. Any help would be appreciated.. Pete Stephens ptfoof AT sbcglobal DOT net rcv_length = recv(threadarg->new_fd,NULL,NULL,MSG_PEEK); if(rcv_length > 0) { // actually get the message rcv_length = pmsg->get_message(); // add message to list to be processed station_message_list.insertAtFront(pmsg); badge_station_state = STATION_THREAD_MSG_INIT; } else if(-1 == rcv_length) { switch(errno) { case EAGAIN :// no messages break; case EBADF : cerr << "Bad file descriptor" << endl; break; case ECONNRESET : cerr << "Connection reset" << endl; break; case EINTR : cerr << "Signal interrupt" << endl; break; case ENOTCONN : cerr << "Not connected" << endl; break; case ENOTSOCK : cerr << "Not a socket" << endl; break; case EOPNOTSUPP : cerr << "Not supported" << endl; break; case ETIMEDOUT : cerr << "Timed out" << endl; break; default : cerr<<"Unknown" <