Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 Feb 1998 16:18:02 -0800 (PST)
From:      Paul Traina <pst@Shockwave.COM>
To:        msmith@FreeBSD.ORG
Cc:        questions@FreeBSD.ORG
Subject:   more on refusing tcp connections before accepting them
Message-ID:  <199802210018.QAA08429@precipice.shockwave.com>

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

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 <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <err.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

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



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