Last active
October 13, 2020 08:48
-
-
Save diegodorado/28979ab59bfff0a805adf15b4751335a 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
#ifdef _WIN32 | |
// taken from https://stackoverflow.com/questions/28027937/cross-platform-sockets | |
/* See http://stackoverflow.com/questions/12765743/getaddrinfo-on-win32 */ | |
#ifndef _WIN32_WINNT | |
#define _WIN32_WINNT 0x0501 /* Windows XP. */ | |
#endif | |
#include <winsock2.h> | |
#include <ws2tcpip.h> | |
#pragma comment(lib,"ws2_32.lib") //Winsock Library | |
#else | |
/* Assume that any non-Windows platform uses POSIX-style sockets instead. */ | |
#include <sys/socket.h> | |
#include <arpa/inet.h> | |
#include <netdb.h> /* Needed for getaddrinfo() and freeaddrinfo() */ | |
#include <unistd.h> /* Needed for close() */ | |
typedef int SOCKET; | |
#endif | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <sys/types.h> | |
#define PORT 9034 | |
int sockInit(void) | |
{ | |
#ifdef _WIN32 | |
WSADATA wsa_data; | |
return WSAStartup(MAKEWORD(1, 1), &wsa_data); | |
#else | |
return 0; | |
#endif | |
} | |
int sockQuit(void) | |
{ | |
#ifdef _WIN32 | |
return WSACleanup(); | |
#else | |
return 0; | |
#endif | |
} | |
/* Note: For POSIX, typedef SOCKET as an int. */ | |
int sockClose(SOCKET sock) | |
{ | |
int status = 0; | |
#ifdef _WIN32 | |
status = shutdown(sock, SD_BOTH); | |
if (status == 0) { status = closesocket(sock); } | |
#else | |
status = shutdown(sock, SHUT_RDWR); | |
if (status == 0) { status = close(sock); } | |
#endif | |
return status; | |
} | |
int main(void) | |
{ | |
fd_set master; // master file descriptor list | |
SOCKET listener; // listening socket descriptor | |
char buf[256]; // buffer for client data | |
int nbytes; | |
struct sockaddr_in server; | |
server.sin_family = AF_INET; | |
server.sin_addr.s_addr = INADDR_ANY; | |
server.sin_port = htons(PORT); | |
struct sockaddr_in sender; | |
sockInit(); | |
listener = socket(AF_INET, SOCK_DGRAM, 0); | |
if (listener == INVALID_SOCKET || listener < 0) { | |
exit(1); | |
} | |
//fixme: check error values for unix | |
if (bind(listener, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) { | |
sockClose(listener); | |
exit(2); | |
} | |
struct timeval tv; | |
tv.tv_sec = 0; | |
tv.tv_usec = 10000; // 10ms | |
int n; | |
int senderSize = sizeof(sender); | |
// main loop | |
for (;;) { | |
FD_ZERO(&master); // clear the master and temp sets | |
// add the listener to the master set | |
FD_SET(listener, &master); | |
n = select(listener, &master, NULL, NULL, &tv); | |
if (n > 0) { | |
// leer el socket | |
nbytes = recvfrom(listener, buf, sizeof(buf), 0, (sockaddr*)&sender , &senderSize); | |
if (nbytes > 0) { | |
// hacer algo... | |
} | |
} | |
else if (n < 0) { | |
perror("select"); | |
exit(4); | |
} | |
//hacer otra cosa... | |
} | |
sockQuit(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment