Created
April 26, 2018 06:24
-
-
Save Batname/f28ee1e935de847a135e9b0ff5d21c40 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
/* | |
Simple UDP Server | |
*/ | |
#include<stdio.h> | |
#include<winsock2.h> | |
#pragma warning(disable:4996) | |
#pragma comment(lib,"ws2_32.lib") //Winsock Library | |
#define BUFLEN 512 //Max length of buffer | |
#define PORT 9999 //The port on which to listen for incoming data | |
int main() | |
{ | |
SOCKET s; | |
struct sockaddr_in server, si_other; | |
int slen, recv_len; | |
char buf[BUFLEN]; | |
WSADATA wsa; | |
slen = sizeof(si_other); | |
//Initialise winsock | |
printf("\nInitialising Winsock..."); | |
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) | |
{ | |
printf("Failed. Error Code : %d", WSAGetLastError()); | |
exit(EXIT_FAILURE); | |
} | |
printf("Initialised.\n"); | |
//Create a socket | |
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) | |
{ | |
printf("Could not create socket : %d", WSAGetLastError()); | |
} | |
printf("Socket created.\n"); | |
//Prepare the sockaddr_in structure | |
server.sin_family = AF_INET; | |
server.sin_addr.s_addr = INADDR_ANY; | |
server.sin_port = htons(PORT); | |
//Bind | |
if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) | |
{ | |
printf("Bind failed with error code : %d", WSAGetLastError()); | |
exit(EXIT_FAILURE); | |
} | |
puts("Bind done"); | |
//keep listening for data | |
while (1) | |
{ | |
printf("Waiting for data..."); | |
fflush(stdout); | |
//clear the buffer by filling null, it might have previously received data | |
memset(buf, '\0', BUFLEN); | |
//try to receive some data, this is a blocking call | |
if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR) | |
{ | |
printf("recvfrom() failed with error code : %d", WSAGetLastError()); | |
exit(EXIT_FAILURE); | |
} | |
//print details of the client/peer and the data received | |
printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port)); | |
printf("Data: %s\n", buf); | |
//now reply the client with the same data | |
if (sendto(s, buf, recv_len, 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR) | |
{ | |
printf("sendto() failed with error code : %d", WSAGetLastError()); | |
exit(EXIT_FAILURE); | |
} | |
} | |
closesocket(s); | |
WSACleanup(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment