Last active
December 15, 2017 16:37
-
-
Save ssrlive/c20c5d18314aee4887dafc8a2c9cfb50 to your computer and use it in GitHub Desktop.
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
/* UDP echo server program -- udp-echo-server.c */ | |
#include <stdio.h> /* standard C i/o facilities */ | |
#include <stdlib.h> /* needed for atoi() */ | |
#include <sys/types.h> /* system data type definitions */ | |
#if defined(_WIN32) | |
#include <WinSock2.h> | |
#pragma comment(lib, "Ws2_32.lib") | |
#else | |
#include <unistd.h> /* defines STDIN_FILENO, system calls,etc */ | |
#include <sys/socket.h> /* socket specific definitions */ | |
#include <netinet/in.h> /* INET constants and stuff */ | |
#include <arpa/inet.h> /* IP address conversion stuff */ | |
#include <netdb.h> /* gethostbyname */ | |
#endif // defined(_WIN32) | |
/* this routine echos any messages (UDP datagrams) received */ | |
#define MAXBUF 1024*1024 | |
void echo( int sd ) { | |
int len,n; | |
char *bufin; | |
struct sockaddr_in remote; | |
/* need to know how big address struct is, len must be set before the | |
call to recvfrom!!! */ | |
len = sizeof(remote); | |
bufin = calloc(MAXBUF, sizeof(char)); | |
while (1) { | |
/* read a datagram from the socket (put result in bufin) */ | |
n=recvfrom(sd,bufin,MAXBUF,0,(struct sockaddr *)&remote,&len); | |
/* print out the address of the sender */ | |
printf("Got a datagram from %s port %d\n", | |
inet_ntoa(remote.sin_addr), ntohs(remote.sin_port)); | |
if (n<0) { | |
perror("Error receiving data"); | |
} else { | |
printf("GOT %d BYTES\n",n); | |
/* Got something, just send it back */ | |
sendto(sd, bufin, n, 0, (struct sockaddr *)&remote, len); | |
} | |
} | |
free(bufin); | |
} | |
/* server main routine */ | |
int main() { | |
int ld; | |
struct sockaddr_in skaddr; | |
int length; | |
{ | |
#if defined(_WIN32) | |
WSADATA wsaData; | |
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR) { | |
printf("Error at WSAStartup()\n"); | |
return 1; | |
} | |
#endif | |
} | |
/* create a socket | |
IP protocol family (PF_INET) | |
UDP protocol (SOCK_DGRAM) | |
*/ | |
if ((ld = socket( PF_INET, SOCK_DGRAM, 0 )) < 0) { | |
printf("Problem creating socket\n"); | |
exit(1); | |
} | |
/* establish our address | |
address family is AF_INET | |
our IP address is INADDR_ANY (any of our IP addresses) | |
the port number is assigned by the kernel | |
*/ | |
skaddr.sin_family = AF_INET; | |
skaddr.sin_addr.s_addr = htonl(INADDR_ANY); | |
skaddr.sin_port = htons(0); | |
if (bind(ld, (struct sockaddr *) &skaddr, sizeof(skaddr))<0) { | |
printf("Problem binding\n"); | |
exit(0); | |
} | |
/* find out what port we were assigned and print it out */ | |
length = sizeof( skaddr ); | |
if (getsockname(ld, (struct sockaddr *) &skaddr, &length)<0) { | |
printf("Error getsockname\n"); | |
exit(1); | |
} | |
/* port number's are network byte order, we have to convert to | |
host byte order before printing ! | |
*/ | |
printf("The server UDP port number is %d\n",ntohs(skaddr.sin_port)); | |
/* Go echo every datagram we get */ | |
echo(ld); | |
return(0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment