Sunday, February 26, 2012

Simple UDP Server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>

extern int h_errno;

void error(const char *msg);

int UdpSocket(int protocol)
{
int sockfd;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd)
{
error(__func__);
}
return sockfd;
}


void error(const char *msg)
{
printf("Error Code: %d", errno);
perror(msg);
}


int BindSocketToAddr(int sock, struct sockaddr_in *addr, int port)
{
int rc;

    if (!addr)
    {
        printf("%s: NULL pointer in addr\n", __func__);
        return -1;
    }
bzero(addr, sizeof(struct sockaddr_in));
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = INADDR_ANY;
addr->sin_port = htons(port);
rc = bind(sock, (struct sockaddr *)addr, sizeof(struct sockaddr));
if (rc < 0)
{
perror(__func__);
}
    return rc;
}



int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in fromSockAddr;
struct sockaddr_in serverSockAddr;
socklen_t fromlen;
char buf[1024];
char fromAddrStr[512];
int n;

    if (argc < 2)
    {
        printf("\n%s <PORT NUMBER>\n\n", argv[0]);
        exit(0);
    }
    setuid(0);

printf("UDP Server\n");

sockfd = UdpSocket(0);
if (sockfd > 0)
{
BindSocketToAddr(sockfd, &serverSockAddr, atoi(argv[1]));
fromlen = sizeof(fromSockAddr);
while (1) {
/* wait for client to send a message */
n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&fromSockAddr, &fromlen);
if (n < 0)
{
error("recvfrom");
break;
}
else {
inet_ntop(fromSockAddr.sin_family, &fromSockAddr.sin_addr, fromAddrStr, sizeof(fromAddrStr));
printf("GOT msg from: %s\n", fromAddrStr);
/* echo back */
n = sendto(sockfd, buf, n, 0, (struct sockaddr *)&fromSockAddr, sizeof(fromSockAddr));
if (n < 0)
{
error("sendto");
break;
}
}
}
}
return 0;
}

No comments:

Post a Comment