Created
April 24, 2016 12:52
-
-
Save vthanki/9022caaf0c195aa384043aa02b2a9744 to your computer and use it in GitHub Desktop.
Simple UDP server taken from https://www.cs.cmu.edu/afs/cs/academic/class/15213-f99/www/class26/udpserver.c and modified a little.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <unistd.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <netdb.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <arpa/inet.h> | |
#include <sys/ioctl.h> | |
#include <net/if.h> | |
#define BUFSIZE 1024 | |
/* | |
* error - wrapper for perror | |
*/ | |
void error(char *msg) { | |
perror(msg); | |
exit(1); | |
} | |
int main(int argc, char **argv) | |
{ | |
int sockfd; | |
int portno; | |
int clientlen; | |
struct sockaddr_in serveraddr; | |
struct sockaddr_in clientaddr; | |
struct hostent *hostp; | |
char buf[BUFSIZE]; | |
char *hostaddrp; | |
int optval; | |
int n; | |
if (argc != 2) { | |
fprintf(stderr, "usage: %s <port>\n", argv[0]); | |
exit(1); | |
} | |
portno = atoi(argv[1]); | |
sockfd = socket(AF_INET, SOCK_DGRAM, 0); | |
if (sockfd < 0) | |
error("ERROR opening socket"); | |
/* setsockopt: Handy debugging trick that lets | |
* us rerun the server immediately after we kill it; | |
* otherwise we have to wait about 20 secs. | |
* Eliminates "ERROR on binding: Address already in use" error. | |
*/ | |
optval = 1; | |
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, | |
(const void *)&optval , sizeof(int)); | |
/* | |
* build the server's Internet address | |
*/ | |
bzero((char *) &serveraddr, sizeof(serveraddr)); | |
serveraddr.sin_family = AF_INET; | |
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); | |
serveraddr.sin_port = htons((unsigned short)portno); | |
/* | |
* bind: associate the parent socket with a port | |
*/ | |
if (bind(sockfd, (struct sockaddr *) &serveraddr, | |
sizeof(serveraddr)) < 0) | |
error("ERROR on binding"); | |
/* | |
* main loop: wait for a datagram, then echo it | |
*/ | |
clientlen = sizeof(clientaddr); | |
while (1) { | |
/* | |
* recvfrom: receive a UDP datagram from a client | |
*/ | |
bzero(buf, BUFSIZE); | |
n = recvfrom(sockfd, buf, BUFSIZE, 0, | |
(struct sockaddr *) &clientaddr, &clientlen); | |
if (n < 0) | |
error("ERROR in recvfrom"); | |
hostaddrp = inet_ntoa(clientaddr.sin_addr); | |
if (hostaddrp == NULL) | |
error("ERROR on inet_ntoa\n"); | |
printf("server received datagram from (%s), data:%s\n", | |
hostaddrp, buf); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment