Skip to content

Instantly share code, notes, and snippets.

@diegodorado
Last active October 13, 2020 08:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save diegodorado/28979ab59bfff0a805adf15b4751335a to your computer and use it in GitHub Desktop.
Save diegodorado/28979ab59bfff0a805adf15b4751335a to your computer and use it in GitHub Desktop.
#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