Beispiel #1
0
int main(int argc, char *argv[])
{
    struct sockaddr_in echoServAddr; /* Server address */
    unsigned short echoServPort;     /* Server port */
    struct sigaction handler;        /* Signal handling action definition */

    /* Test for correct number of parameters */
    if (argc != 2)
    {
        fprintf(stderr,"Usage:  %s <SERVER PORT>\n", argv[0]);
        exit(1);
    }

    echoServPort = atoi(argv[1]);  /* First arg:  local port */

    /* Create socket for sending/receiving datagrams */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        DieWithError("socket() failed");

    /* Set up the server address structure */
    memset(&echoServAddr, 0, sizeof(echoServAddr));   /* Zero out structure */
    echoServAddr.sin_family = AF_INET;                /* Internet family */
    echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
    echoServAddr.sin_port = htons(echoServPort);      /* Port */

    /* Bind to the local address */
    if (bind(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
        DieWithError("bind() failed");

    /* Set signal handler for SIGIO */
    handler.sa_handler = SIGIOHandler;
    /* Create mask that mask all signals */
    if (sigfillset(&handler.sa_mask) < 0) 
        DieWithError("sigfillset() failed");
    /* No flags */
    handler.sa_flags = 0;

    if (sigaction(SIGIO, &handler, 0) < 0)
        DieWithError("sigaction() failed for SIGIO");

    /* We must own the socket to receive the SIGIO message */
    if (fcntl(sock, F_SETOWN, getpid()) < 0)
        DieWithError("Unable to set process owner to us");

    /* Arrange for nonblocking I/O and SIGIO delivery */
    if (fcntl(sock, F_SETFL, O_NONBLOCK | FASYNC) < 0)
        DieWithError("Unable to put client sock into non-blocking/async mode");

    /* Go off and do real work; echoing happens in the background */

    for (;;)
        UseIdleTime();

    /* NOTREACHED */
}
static void RunUDPEchoServer(bool is_connect,const char* service_str)
{
    struct addrinfo addr_criteria;
    memset(&addr_criteria,0,sizeof(addr_criteria));
    addr_criteria.ai_family = AF_UNSPEC;
    addr_criteria.ai_flags  = AI_PASSIVE;
    addr_criteria.ai_socktype = SOCK_DGRAM;
    addr_criteria.ai_protocol = IPPROTO_UDP;
    
    struct addrinfo* serv_addr;
    int result = getaddrinfo(nullptr, service_str, &addr_criteria, &serv_addr);
    if (result != 0)
    {
        GUtility::DieWithUserMessage("getaddrinfo() failed", gai_strerror(result));
    }
    
    serv_sock = socket(serv_addr->ai_family, serv_addr->ai_socktype, serv_addr->ai_protocol);
    if (serv_sock<0)
    {
        GUtility::DieWithSystemMessage("socket() failed");
    }
    if (bind(serv_sock, serv_addr->ai_addr, serv_addr->ai_addrlen)<0)
    {
        GUtility::DieWithSystemMessage("bind() failed");
    }
    
    freeaddrinfo(serv_addr);
    struct sigaction handler;
    handler.sa_handler = SIGIOHandler;
    if (sigfillset(&handler.sa_mask) < /* DISABLES CODE */ (0))
    {
        GUtility::DieWithSystemMessage("sigfillset() failed");
    }
    handler.sa_flags = 0;
    
    if (sigaction(SIGIO, &handler, 0)<0)
    {
        GUtility::DieWithSystemMessage("sigaction() failed for SIGIO");
    }
    
    if (fcntl(serv_sock, F_SETOWN, getpid()) < 0)
    {
        GUtility::DieWithSystemMessage("Unable to set process owner to us");
    }
    
    if (fcntl(serv_sock, F_SETFL, O_NONBLOCK|FASYNC) < 0)
    {
        GUtility::DieWithSystemMessage("Unable to put client sock into non-blocking/async mode");
    }
    
    while (true)
    {
        UseIdleTime();
    }
}
Beispiel #3
0
int main (int argc, char *argv[])
{
	struct sockaddr_in	echoServAddr;	// Local address
	u16			echoServPort;	// Server port
	struct sigaction	handler;
	int	rc;

	setprogname(argv[0]);

	if (argc != 2) {
		pr_usage("<UDP Server Port>");
	}
	echoServPort = atoi(argv[1]);

	/* Create socket for sending/receiving datagrams */
	Sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (Sock < 0) fatal("socket():");

	/* Construct local address structure */
	zero(echoServAddr);
	echoServAddr.sin_family      = AF_INET;		// Internet address family
	echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);// Any incoming interface
	echoServAddr.sin_port        = htons(echoServPort);// Local port

	/* Bind to the local address */
	rc = bind(Sock, (struct sockaddr *)&echoServAddr, sizeof(echoServAddr));
	if (rc < 0) fatal("bind():");

	/* Set signal handler for SIGIO */
	handler.sa_handler = SIGIOHandler;
	/* Create mask that masks all signals */
	if (sigfillset( &handler.sa_mask) < 0) fatal("sigfillset():");
	handler.sa_flags = 0;

	/* Set signal handling for itnerrupt signals */
	if (sigaction(SIGIO, &handler, 0) < 0) fatal("sigaction():");

	/* We must own the socket to receive the SIGIO message */
	if (fcntl(Sock, F_SETOWN, getpid()) < 0) {
		fatal("Unable to set process owner to us:");
	}
	/* Arrange for nonblocking I/O and SIGIO delviery */
	if (fcntl(Sock, F_SETFL, O_NONBLOCK | FASYNC) < 0) {
		fatal("Unable to put client sock into nonblocking/async mode:");
	}

	for (;;) {
		UseIdleTime();
	}
}