Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Mar 2007 15:17:29 +0300
From:      Anton Yuzhaninov <citrin@citrin.ru>
To:        freebsd-net@freebsd.org
Subject:   is setsockopt SO_NOSIGPIPE work?
Message-ID:  <2110071423.20070301151729@citrin.ru>

next in thread | raw e-mail | index | archive | help

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 <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>

#include <signal.h>

#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--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2110071423.20070301151729>