#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;
}
Sunday, February 26, 2012
Simple UDP Server
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment