#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