{
SOCKADDR_IN sin;
WORD wVersionRequested;
WSADATA wsaData;
int err, t = 1;
unsigned long u = 0;
wVersionRequested = MAKEWord(1, 1);
if((err = WSAStartup(wVersionRequested, &wsaData)) != 0)
{
WSACleanup();
return err;
}
// Open a socket
*socketHandle = socket(AF_INET, SOCK_DGRAM, 0);
if(*socketHandle == INVALID_SOCKET)
{
err = WSAGetLastError();
closesocket(*socketHandle);
WSACleanup();
return err;
}
// bind the socket to an Address and Port
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);
if((err = bind(*socketHandle, (LPSOCKADDR)&sin, sizeof(sin))) != 0)
{
err = WSAGetLastError();
closesocket(*socketHandle);
WSACleanup();
return err;
}
// Set the socket to Blocking I/O
ioctlsocket(*socketHandle, FIONBIO, &u);
// Set the socket to Broadcast
setsockopt(*socketHandle, SOL_SOCKET, SO_BROADCAST, (char*)&t, sizeof(int));
return 0;
}
int UDPRead (int socketHandle, void *data, int maxSize, int timeout)
{
int fromSize;
SOCKADDR_IN sin;
fromSize = sizeof(sin);
// Set the receive timeout period to the one specified by the timeout parameter.
setsockopt(socketHandle, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(int));
// Recieve the data on the port.
if(recvfrom(socketHandle, data, maxSize, 0, (LPSOCKADDR)&sin, &fromSize) < 0)
return WSAGetLastError();
return 0;
}
int UDPWrite (int socketHandle, void *data, int dataSize, char* address, int port)
{
SOCKADDR_IN sin;
int err;
// Set the address and port option for the write operation
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(address);
sin.sin_port = htons(port);
// Write the data out the socket
if(sendto(socketHandle, data, dataSize, 0, (LPSOCKADDR)&sin, sizeof(SOCKADDR)) < 0)
return WSAGetLastError();
return 0;
}
int UDPClose (int socketHandle)
{
// Close the socket
closesocket(socketHandle);
return 0;
}
char *UDPErrorString(int error)
{
switch(error)
{
case 0:
return "No Error.";
break;
case WSAENETDOWN:
return "The network subsystem has failed.";
break;
case WSAEADDRINUSE:
return "Socket address is already in use.";
break;
case WSAEINPROGRESS:
case WSAENOBUFS:
return "Another Windows Socket Operation is in Progress.";
break;
case WSAEMFILE:
return "Not Enough Available Socket Resources.";
break;
case WSAENOTSOCK:
return "Not a Socket.";
break;
case WSAESHUTDOWN:
return "The Socket has been Shutdown.";
break;
case WSAEMSGSIZE:
return "The data was to large to fit in the specified buffer and has been truncated.";
break;
case WSAECONNABORTED:
return "The connection has been aborted";
break;
case WSAECONNRESET:
return "The connection was reset by the remote site.";
break;
case WSAETIMEDOUT:
return "The connection timed out.";
break;
case WSANOTINITIALISED:
return "Unknown System Error.";
break;
case WSAEACCES:
return "Unknown System Error.";
break;
case WSAEINTR:
return "Unknown System Error.";
break;
case WSAEFAULT:
return "Unknown System Error.";
break;
case WSAENETRESET:
return "Unknown System Error.";
break;
case WSAENOTCONN:
return "Unknown System Error.";
break;
case WSAEOPNOTSUPP:
return "Unknown System Error.";
break;
case WSAEWOULDBLOCK:
return "Unknown System Error.";
break;
case WSAEINVAL:
return "Unknown System Error.";
break;
default:
return "Unknown System Error.";
break;
}
return "Unknown System Error.";
}