From owner-freebsd-questions Fri Feb 20 16:19:14 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id QAA07265 for freebsd-questions-outgoing; Fri, 20 Feb 1998 16:19:14 -0800 (PST) (envelope-from owner-freebsd-questions@FreeBSD.ORG) Received: from precipice.shockwave.com (precipice.shockwave.com [207.105.15.229]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id QAA07194; Fri, 20 Feb 1998 16:18:58 -0800 (PST) (envelope-from pst@Shockwave.COM) Received: (from pst@localhost) by precipice.shockwave.com (8.8.8/8.8.8) id QAA08429; Fri, 20 Feb 1998 16:18:02 -0800 (PST) (envelope-from pst) Date: Fri, 20 Feb 1998 16:18:02 -0800 (PST) From: Paul Traina Message-Id: <199802210018.QAA08429@precipice.shockwave.com> To: msmith@FreeBSD.ORG Subject: more on refusing tcp connections before accepting them Cc: questions@FreeBSD.ORG Sender: owner-freebsd-questions@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG client: telnet localhost 13999 Trying 127.0.0.1... Connected to localhost.shockwave.com. Escape character is '^]'. Connection closed by foreign host. server: pst@precipice$ ./foo foo: recvmsg: Socket is not connected Received connection from 127.0.0.1:1453 I don't want the client to even see the connection establised, I want it refused by TCP, but I need to see his source address first. /* * Test jig to see if we can grab connection data before accepting a * remote TCP connection. */ #include #include #include #include #include #include #include #include #include void dump_control (struct msghdr *m) { u_int i; struct cmsghdr *cmsg; u_int len = m->msg_controllen; for (cmsg = CMSG_FIRSTHDR(m); len > 0; cmsg = CMSG_NXTHDR(m, cmsg)) { len -= cmsg->cmsg_len; printf("Message: [%d,%d,%d] =", cmsg->cmsg_len, cmsg->cmsg_level, cmsg->cmsg_type); for (i = sizeof(struct cmsghdr); i < cmsg->cmsg_len; i++) printf(" 0x%x", CMSG_DATA(cmsg)[i]); printf("\n"); } } void check_recvmsg (int s) { struct msghdr msg; char ctrlbuf[BUFSIZ]; memset(&msg, 0, sizeof(msg)); msg.msg_control = ctrlbuf; msg.msg_controllen = sizeof(ctrlbuf); memset(ctrlbuf, 0, sizeof(ctrlbuf)); if (recvmsg(s, &msg, MSG_PEEK) < 0) warn("recvmsg"); else dump_control(&msg); } int main (int argc, char **argv) { int s, s2; struct sockaddr_in saddr, iaddr; int iaddrlen; if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) err(1, "socket"); memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(13999); if (bind(s, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) err(1, "bind"); if (listen(s, 5) < 0) err(1, "listen"); check_recvmsg(s); /* try it for grins on the listen socket */ iaddrlen = sizeof(iaddr); if ((s2 = accept(s, (struct sockaddr *) &iaddr, &iaddrlen)) < 0) err(1, "accept"); printf("Received connection from %s:%d\n", inet_ntoa(iaddr.sin_addr), htons(iaddr.sin_port)); check_recvmsg(s2); /* nope, see if anything on accept socket */ close(s2); close(s); exit(0); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message