From OpenTTCN
#include "Utilities.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <assert.h>
#include <ctype.h>
#include <malloc.h>
#ifndef _WIN32
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
typedef int socklen_t;
#endif
int _socketDesc = 0;
int _socketDescInitialized = 0;
/* Returns 0 on success, non-zero on error. */
int bindSocketToAnyPort(int* dstSocketDesc)
{
int rval = 0;
int errorCode = 0;
static struct sockaddr_in myaddr;
*dstSocketDesc = (int) socket(PF_INET, SOCK_DGRAM, 0);
memset (&myaddr, 0, sizeof myaddr);
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
#ifdef _WIN32
myaddr.sin_family = AF_INET;
#endif
myaddr.sin_port = htons(0); /* pick any available port */
rval = bind(*dstSocketDesc, (struct sockaddr *) &myaddr, sizeof myaddr);
if (rval < 0)
{
#ifndef _WIN32
printf("bindSocketToAnyPort(): "
"Error: bind() returned: %s\n", strerror(errno));
#else
int errorCode = WSAGetLastError();
printf("bindSocketToAnyPort(): "
"Error: bind() returned error code %i\n", errorCode);
#endif
return 1;
}
return 0;
}
int sendDatagramPacket(unsigned long host_,
unsigned short port_, const char* data_, long length_)
{
int rval = 0;
int errorCode = 0;
struct sockaddr_in saddr;
memset (&saddr, 0, sizeof saddr);
if (!_socketDescInitialized)
{
rval = bindSocketToAnyPort(&_socketDesc);
if (rval)
{
printf("sendDatagramPacket(): Cannot bind socket.\n");
return 1;
}
_socketDescInitialized = 1;
}
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = host_;
saddr.sin_port = port_;
while (1)
{
rval = sendto(
_socketDesc,
data_,
length_,
0,
(struct sockaddr *) &saddr,
sizeof saddr);
if ((-1 == rval) && ((errno == EAGAIN) || (errno == EINTR)))
{
/* resending */
}
else if (-1 == rval)
{
printf("sendDatagramPacket(): Cannot send frame.\n");
#ifndef _WIN32
printf("sendDatagramPacket(): send error = %s\n", strerror(errno));
#else
errorCode = WSAGetLastError();
printf("sendDatagramPacket(): send error code = %i\n", errorCode);
#endif
return 1;
}
else
{
/* send operation succeeded */
break;
}
}
return 0;
}