From owner-freebsd-current@FreeBSD.ORG Mon Sep 17 08:40:46 2007 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BCCFE16A417 for ; Mon, 17 Sep 2007 08:40:46 +0000 (UTC) (envelope-from dengxf@gmail.com) Received: from wa-out-1112.google.com (wa-out-1112.google.com [209.85.146.179]) by mx1.freebsd.org (Postfix) with ESMTP id 865F413C458 for ; Mon, 17 Sep 2007 08:40:46 +0000 (UTC) (envelope-from dengxf@gmail.com) Received: by wa-out-1112.google.com with SMTP id k17so1942346waf for ; Mon, 17 Sep 2007 01:40:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:date:from:to:subject:message-id:mime-version:content-type:content-transfer-encoding:x-mailer; bh=ekUUM1SmOPbYJG1bLUIkZtLSPfMwOMvltD62QLomcbY=; b=qHuZspHk8GnjObNPZiYaCgib5VqdiuO3eSg3rq/9Avpgo33GtiypodhAGYtoryEgzFUsrpCR7MQCiIl3a36aOqDuwVh/NsEYJIRYCEYcu8EiQRAoAkvnC4xUIxFGTBVZfWZ8I7NyVXhK3ffLc5aXwYQeueX7bDIbSVsg19XZaJA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:date:from:to:subject:message-id:mime-version:content-type:content-transfer-encoding:x-mailer; b=TPdyCMkM2C0ks1hxrBafgk4h1Ve9w6AZt5xLqmE17ZZABVXmAzHiFIhs2fGcCAOWLu7HferAFgh7iOAE6ZEEnuUk+SgKVOeHz7WSWZvTOO9YOlwvvreWyvq0b3/41fYXylu+CrDlopPWxMAbhToTkDgpMTgXUwsTy5XlbEQaaP0= Received: by 10.114.178.1 with SMTP id a1mr43910waf.1190016762956; Mon, 17 Sep 2007 01:12:42 -0700 (PDT) Received: from ?127.0.0.1? ( [218.94.128.114]) by mx.google.com with ESMTPS id v32sm4391813wah.2007.09.17.01.12.40 (version=SSLv3 cipher=RC4-MD5); Mon, 17 Sep 2007 01:12:41 -0700 (PDT) Date: Mon, 17 Sep 2007 16:12:41 +0800 From: Deng XueFeng To: freebsd-current@freebsd.org Message-Id: <20070917160248.003B.DENGXF@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver. 2.31 [CN] Subject: using unix domain socket get ENOTCONN in both 6.2 and 7.0 X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 Sep 2007 08:40:46 -0000 today, when I trace some performance issue about my streaming server. I found a strange thing in domain socket. when read from a domain socket(created by socketpair,and write/read some times). read return -1, and errno = ENOTCONN (Socket is not connected.) then I write a test program, and can reproduce in 6.2 and 7.0 but not each time will get ENOTCONN. thanks. #./ud_test child recv len [4992] failed: Unknown error: 0 main send len [-1] failed: Socket is not connected /* * * gcc -Wall -Werror -o ud_test ud_test.c * */ #include #include #include #include #include #include #include #include int ud[2]; int child(void) { int fd; char buf[8193]; int ret; int flag; int err; fd = ud[1]; flag = fcntl(fd, F_GETFL); fcntl(fd, flag | O_NONBLOCK); while (1) { ret = read(fd, buf, sizeof(buf)); if (ret == 0) { usleep(100*1000); continue; } if (ret != sizeof(buf)) { err = errno; close(fd); printf("child recv len [%d] failed: %s\n", ret, strerror(err)); exit(1); } memset(buf, 'B', sizeof(buf)); ret = write(fd, buf, sizeof(buf)); if (ret != sizeof(buf)) { err = errno; close(fd); printf("child send len [%d] failed: %s\n", ret, strerror(err)); exit(1); } } return 0; } int start_child(void) { pid_t pid; pid = fork(); if (pid == -1) { perror("fork failed"); return (-1); } else if (pid == 0) { close(ud[0]); child(); exit(1); } else { close(ud[1]); return (0); } } int test_main(void) { int fd = ud[0]; int ret; char buf[8193]; int flag; int err; flag = fcntl(fd, F_GETFL); fcntl(fd, flag | O_NONBLOCK); while (1) { memset(buf, 'A', sizeof(buf)); ret = write(fd, buf, sizeof(buf)); if (ret != sizeof(buf)) { err = errno; close(fd); printf("main send len [%d] failed: %s\n", ret, strerror(err)); exit(1); } ret = read(fd, buf, sizeof(buf)); if (ret != sizeof(buf)) { err = errno; close(fd); printf("main recv len [%d] failed: %s\n", ret, strerror(err)); exit(1); } } return (0); } int main(void) { int ret; ret = socketpair(AF_UNIX, SOCK_STREAM, 0, &ud[0]); if (ret < 0) { printf("socketpair failed: %s\n", strerror(errno)); exit(1); } if (start_child() != 0) { return 1; } /* Let the child process get the socket established */ sleep(2); test_main(); puts("Parent process finished."); return 0; } -- Deng XueFeng