From owner-freebsd-net@FreeBSD.ORG Sat Aug 8 08:42:57 2009 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 91272106566B for ; Sat, 8 Aug 2009 08:42:57 +0000 (UTC) (envelope-from denis.berezhnoy@gmail.com) Received: from mail-yx0-f181.google.com (mail-yx0-f181.google.com [209.85.210.181]) by mx1.freebsd.org (Postfix) with ESMTP id 443798FC08 for ; Sat, 8 Aug 2009 08:42:57 +0000 (UTC) Received: by yxe11 with SMTP id 11so2611113yxe.3 for ; Sat, 08 Aug 2009 01:42:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:content-type; bh=2urOfkkFNRhqjeyPBGMUSoRIuzCLYpuEuzLptBYP1iw=; b=cl0Myk/gxd3BwgEAu/fZVSysKi31Q90/DvwHaB3MbTEOREUi8A4T4yRhVp7RQKcRV0 L5SwUjPxo3Eop/CLPiRps4j7pjGjc7M0VVsUQuvRInHoODhKCzfEOLKNf0OhIYJ+tk4d pLoDtqkwC1JM8nDLnzUbKad2qOwr/7oSH4c3E= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; b=mN9VRc2KrWAqph9qwZt4DKitwRU6PFQ2P95LaR8hQrfm3ZoqpMV+kpzw1WzSc+RiFR lAgT/8qWJoX6q3jlSefue3niqQ9Pobhnwi+lEW9VaYiWpvqpyMP37Z8jv3o46RwAyvZv a7S1VwH5eh10DAoOlQaBm7Z22YK7hcKLuJLNA= MIME-Version: 1.0 Received: by 10.231.14.129 with SMTP id g1mr974817iba.16.1249720976296; Sat, 08 Aug 2009 01:42:56 -0700 (PDT) In-Reply-To: <18b5e36e0908060115g76a56da3qb23fdd208e7c4a4c@mail.gmail.com> References: <18b5e36e0908060115g76a56da3qb23fdd208e7c4a4c@mail.gmail.com> Date: Sat, 8 Aug 2009 17:42:56 +0900 Message-ID: <18b5e36e0908080142o5914903n335ebae17e82e985@mail.gmail.com> From: Denis Berezhnoy To: freebsd-net@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Subject: Re: kevent behavior with TCP socket X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 08 Aug 2009 08:42:57 -0000 Hi, Sorry for my previous post it was completely unclear I believe. Here is problem description in pure C. Can you please take a look at the code below: #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { struct sockaddr_in addr; struct sockaddr_in addr2; int sd, cd, port, sRet; int sHandle; int sEventNum = 0; struct kevent sChange; struct kevent sEvent; struct timespec *sTimeoutPtr; struct timespec sTimeout; struct timeval sTimeVal1 = {0,0}; struct timeval sTimeVal2 = {0,0}; printf("Socket test start\n"); sd = socket(PF_INET, SOCK_STREAM, 0); if ( sd < 0 ) { printf("Server socket error\n"); return 0; } port = htons(10000); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = port; addr.sin_addr.s_addr = htonl(INADDR_ANY); if ( bind(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0 ) { printf ("Server bind errror\n"); return 0; } if ( listen(sd, 1) != 0 ) { printf ("Server listen error \n"); return 0; } cd = socket(PF_INET, SOCK_STREAM, 0); if ( cd < 0 ) { printf("Client socket error\n"); return 0; } sRet = fcntl(cd, F_GETFL, 0); sRet |= O_NONBLOCK; sRet = fcntl(cd, F_SETFL, sRet); if (sRet < 0) { printf("can not set non block\n"); } port = htons(10000); memset(&addr2, 0, sizeof(addr2)); /* Clear struct */ addr2.sin_family = AF_INET; /* Internet/IP */ addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK); /* IP address */ addr2.sin_port = port; /* server port */ /* Establish connection */ if ((sRet = connect(cd, (struct sockaddr *) &addr2, sizeof(addr2))) < 0) { printf("Failed to connect with server %d\n", errno); } sHandle = kqueue(); if (sHandle == -1) { printf("Poll can not created queue\n"); } sTimeout.tv_sec = 0; sTimeout.tv_nsec = 100000000;; EV_SET(&sChange, cd, EVFILT_WRITE, EV_ADD,0, 0, 0); gettimeofday(&sTimeVal1, NULL); sEventNum = kevent(sHandle, &sChange, 1, &sEvent, 1, &sTimeout); gettimeofday(&sTimeVal2, NULL); printf ("Kevent event num %d wait time %d \n", sEventNum, sTimeVal2.tv_usec - sTimeVal1.tv_usec); if (sEventNum == 1) { printf ("Event filter %d flag %d data %d \n", sEvent.filter, sEvent.flags, sEvent.data); } close(sHandle); close(cd); close(sd); printf("Socket test end\n"); } Program output Socket test start Failed to connect with server 36 Kevent event num 1 wait time 26 Event filter -2 flag 0 data 43008 Socket test end The question is why kevent returns 1 event when server does not accept connections from clients. Best regards, Denis 2009/8/6 Denis Berezhnoy > Hi guys, > > > I have question regarding kevent behavior with TCP socket. Hope you can > advise anything. > > > I am trying to connect the server in non block mode. When I call connect it > returns -1 and errno=EINPROGRESS. Then I use kqueue and kevent with > EVFILT_WRITE and timeout 100 msec to wait when server will be available to > accept connection. > > > kevent returns me 1 event without any timeout (filters = -2 (EVFILT_WRITE) > flags = 0 data = 43008) > > > > So I consider this as server is ready to accept connection but when I check > socket error after kevent returns by > > getsockopt with SOL_SOCKET and SO_ERROR params it returns me socket error > 54 ECONNRESET /* Connection reset by peer */ > > and no connection can be established using this socket. > > > I am confused why kevent returns event that seems to indicate good > condition but actual socket status indicates error. What I am doing wrong? > > > Sorry for this rough description of the problem my code is the part of > large system so I can not simply copy paste code. > > > I am using: > > > FreeBSD freebsd 7.1-RELEASE FreeBSD 7.1-RELEASE #0: Thu Jan 1 14:37:25 UTC > 2009 root@logan.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 > > > Best regards > > Denis >