is setsockopt SO_NOSIGPIPE work?
Anton Yuzhaninov
citrin at citrin.ru
Thu Mar 1 12:29:11 UTC 2007
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 = 1;
socklen_t slen, c_len;
struct sockaddr_in serv_addr, client_addr;
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
err(1, "socket() failed");
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
serv_addr.sin_port = 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 = 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
--
WBR,
Anton Yuzhaninov
More information about the freebsd-net
mailing list