From owner-freebsd-net@FreeBSD.ORG Thu Mar 1 12:29:11 2007 Return-Path: X-Original-To: freebsd-net@freebsd.org Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6B82016A401 for ; Thu, 1 Mar 2007 12:29:11 +0000 (UTC) (envelope-from citrin@citrin.ru) Received: from mail.classis.ru (classis.ru [213.248.60.120]) by mx1.freebsd.org (Postfix) with ESMTP id D5EF213C467 for ; Thu, 1 Mar 2007 12:29:10 +0000 (UTC) (envelope-from citrin@citrin.ru) Received: from citrin (unknown [81.19.65.100]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: citrin.citrin.ru) by mail.classis.ru (Postfix) with ESMTP id A335012279AE for ; Thu, 1 Mar 2007 15:18:24 +0300 (MSK) Date: Thu, 1 Mar 2007 15:17:29 +0300 From: Anton Yuzhaninov X-Mailer: The Bat! (v3.62.14) Professional Organization: Rambler X-Priority: 3 (Normal) Message-ID: <2110071423.20070301151729@citrin.ru> To: freebsd-net@freebsd.org MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="----------EA1EE1A83EA702A6" X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Subject: is setsockopt SO_NOSIGPIPE work? 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: Thu, 01 Mar 2007 12:29:11 -0000 This is a cryptographically signed message in MIME format. ------------EA1EE1A83EA702A6 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Hello. Is SO_NOSIGPIPE work? It try to set on socket option SO_NOSIGPIPE but anyway process received sigpipe. Test case: #include #include #include #include #define SERVER_PORT 8000 void sigpipe(int signo __unused) { printf("SIGPIPE recivied\n"); } int main(int argc, char *argv[]) { int s , c; int on =3D 1; socklen_t slen, c_len; struct sockaddr_in serv_addr, client_addr; if ((s =3D socket(PF_INET, SOCK_STREAM, 0)) < 0) err(1, "socket() failed"); bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin_family =3D AF_INET; serv_addr.sin_addr.s_addr =3D htonl(INADDR_LOOPBACK); serv_addr.sin_port =3D htons(SERVER_PORT); if (bind(s, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) err(1, "bind() failed"); if (listen(s, -1) < 0) err(1, "listen() failed"); (void)signal(SIGPIPE, sigpipe); for (;;) { if ((c =3D accept(s, (struct sockaddr *)&client_addr, &c_len)) < 0)= { warn("accept() failed"); continue; } if (setsockopt(c, SOL_SOCKET, SO_NOSIGPIPE, (void *)&on, sizeof(on)= ) < 0) err(1, "setsockopt(SOL_SOCKET, SO_NOSIGPIPE) failed"); sleep(2); if (write(c, "abc", strlen("abc")) < 0) warn("first write() failed"); if (write(c, "\r\n", strlen("\r\n")) < 0) warn("second write() failed"); close(c); } } Client connect, than disconnect. server print: SIGPIPE recivied a.out: second write() failed: Broken pipe Is SO_NOSIGPIPE broken, or something wrong in my code? system: 6.2-STABLE FreeBSD 6.2-STABLE #0: Mon Feb 19 17:07:12 MSK 2007 --=20 WBR, Anton Yuzhaninov ------------EA1EE1A83EA702A6--