#include <errno.h>Go to the source code of this file.
Defines | |
| #define | WSANOTINITIALISED EPROTONOSUPPORT |
Typedefs | |
| typedef int | Socket |
Functions | |
| int | stunclosesocket (Socket fd) |
| int | getErrno () |
| Socket | openPort (unsigned short port, unsigned int interfaceIp, bool verbose) |
| Open a UDP socket to receive on the given port - if port is 0, pick a a port, if interfaceIp!=0 then use ONLY the interface specified instead of all of them. | |
| bool | getMessage (Socket fd, char *buf, int *len, unsigned int *srcIp, unsigned short *srcPort, bool verbose) |
| recive a UDP message | |
| bool | sendMessage (Socket fd, char *msg, int len, unsigned int dstIp, unsigned short dstPort, bool verbose) |
| send a UDP message | |
| void | initNetwork () |
| set up network - does nothing in unix but needed for windows | |
Variables | |
| static const Socket | STUN_INVALID_SOCKET = -1 |
| static const int | STUN_SOCKET_ERROR = -1 |
| #define WSANOTINITIALISED EPROTONOSUPPORT |
Definition at line 71 of file stun_udp.h.
Referenced by stunParseHostName().
| typedef int Socket |
Definition at line 63 of file stun_udp.h.
| int getErrno | ( | ) | [inline] |
Definition at line 69 of file stun_udp.h.
Referenced by getMessage(), openPort(), sendMessage(), stunNatType(), stunParseHostName(), and stunServerProcess().
{ return errno; }
| bool getMessage | ( | Socket | fd, | |
| char * | buf, | |||
| int * | len, | |||
| unsigned int * | srcIp, | |||
| unsigned short * | srcPort, | |||
| bool | verbose | |||
| ) |
recive a UDP message
Definition at line 114 of file udp.cc.
Referenced by stunNatType(), stunOpenSocket(), stunOpenSocketPair(), stunServerProcess(), and stunTest().
{
assert( fd != STUN_INVALID_SOCKET );
int originalSize = *len;
assert( originalSize > 0 );
struct sockaddr_in from;
int fromLen = sizeof(from);
*len = recvfrom(fd,
buf,
originalSize,
0,
(struct sockaddr *)&from,
(socklen_t*)&fromLen);
if ( *len == STUN_SOCKET_ERROR )
{
int err = getErrno();
switch (err)
{
case ENOTSOCK:
cerr << "Error fd not a socket" << endl;
break;
case ECONNRESET:
cerr << "Error connection reset - host not reachable" << endl;
break;
default:
cerr << "Socket Error=" << err << endl;
}
return false;
}
if ( *len < 0 )
{
clog << "socket closed? negative len" << endl;
return false;
}
if ( *len == 0 )
{
clog << "socket closed? zero len" << endl;
return false;
}
*srcPort = ntohs(from.sin_port);
*srcIp = ntohl(from.sin_addr.s_addr);
if ( (*len)+1 >= originalSize )
{
if (verbose)
{
clog << "Received a message that was too large" << endl;
}
return false;
}
buf[*len]=0;
return true;
}
| void initNetwork | ( | ) |
set up network - does nothing in unix but needed for windows
Definition at line 258 of file udp.cc.
{
#ifdef WIN32
WORD wVersionRequested = MAKEWORD( 2, 2 );
WSADATA wsaData;
int err;
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
// could not find a usable WinSock DLL
cerr << "Could not load winsock" << endl;
assert(0); // is this is failing, try a different version that 2.2, 1.0 or later will likely work
exit(1);
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup( );
cerr << "Bad winsock verion" << endl;
assert(0); // is this is failing, try a different version that 2.2, 1.0 or later will likely work
exit(1);
}
#endif
}
| Socket openPort | ( | unsigned short | port, | |
| unsigned int | interfaceIp, | |||
| bool | verbose | |||
| ) |
Open a UDP socket to receive on the given port - if port is 0, pick a a port, if interfaceIp!=0 then use ONLY the interface specified instead of all of them.
Definition at line 38 of file udp.cc.
Referenced by stunInitServer(), stunNatType(), stunOpenSocket(), stunOpenSocketPair(), stunServerProcess(), and stunTest().
{
Socket fd;
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if ( fd == STUN_INVALID_SOCKET )
{
int err = getErrno();
cerr << "Could not create a UDP socket:" << err << endl;
return STUN_INVALID_SOCKET;
}
struct sockaddr_in addr;
memset((char*) &(addr),0, sizeof((addr)));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
if ( (interfaceIp != 0) &&
( interfaceIp != 0x100007f ) )
{
addr.sin_addr.s_addr = htonl(interfaceIp);
if (verbose )
{
clog << "Binding to interface "
<< hex << "0x" << htonl(interfaceIp) << dec << endl;
}
}
if ( bind( fd,(struct sockaddr*)&addr, sizeof(addr)) != 0 )
{
int e = getErrno();
switch (e)
{
case 0:
{
cerr << "Could not bind socket" << endl;
return STUN_INVALID_SOCKET;
}
case EADDRINUSE:
{
cerr << "Port " << port << " for receiving UDP is in use" << endl;
return STUN_INVALID_SOCKET;
}
break;
case EADDRNOTAVAIL:
{
if ( verbose )
{
cerr << "Cannot assign requested address" << endl;
}
return STUN_INVALID_SOCKET;
}
break;
default:
{
cerr << "Could not bind UDP receive port"
<< "Error=" << e << " " << strerror(e) << endl;
return STUN_INVALID_SOCKET;
}
break;
}
}
if ( verbose )
{
clog << "Opened port " << port << " with fd " << fd << endl;
}
assert( fd != STUN_INVALID_SOCKET );
return fd;
}
| bool sendMessage | ( | Socket | fd, | |
| char * | msg, | |||
| int | len, | |||
| unsigned int | dstIp, | |||
| unsigned short | dstPort, | |||
| bool | verbose | |||
| ) |
send a UDP message
Definition at line 183 of file udp.cc.
Referenced by stunSendTest(), and stunServerProcess().
{
assert( fd != STUN_INVALID_SOCKET );
int s;
if ( dstPort == 0 )
{
// sending on a connected port
assert( dstIp == 0 );
s = send(fd,buf,l,0);
}
else
{
assert( dstIp != 0 );
assert( dstPort != 0 );
struct sockaddr_in to;
int toLen = sizeof(to);
memset(&to,0,toLen);
to.sin_family = AF_INET;
to.sin_port = htons(dstPort);
to.sin_addr.s_addr = htonl(dstIp);
s = sendto(fd, buf, l, 0,(sockaddr*)&to, toLen);
}
if ( s == STUN_SOCKET_ERROR )
{
int e = getErrno();
switch (e)
{
case ECONNREFUSED:
case EHOSTDOWN:
case EHOSTUNREACH:
{
// quietly ignore this
}
break;
case EAFNOSUPPORT:
{
cerr << "err EAFNOSUPPORT in send" << endl;
}
break;
default:
{
cerr << "err " << e << " " << strerror(e) << " in send" << endl;
}
}
return false;
}
if ( s == 0 )
{
cerr << "no data sent in send" << endl;
return false;
}
if ( s != l )
{
if (verbose)
{
cerr << "only " << s << " out of " << l << " bytes sent" << endl;
}
return false;
}
return true;
}
| int stunclosesocket | ( | Socket | fd | ) | [inline] |
Definition at line 67 of file stun_udp.h.
Referenced by stunFindLocalInterfaces(), stunNatType(), stunOpenSocketPair(), stunRand(), stunServerProcess(), and stunStopServer().
{ return close(fd); };
const Socket STUN_INVALID_SOCKET = -1 [static] |
Definition at line 64 of file stun_udp.h.
Referenced by getMessage(), openPort(), sendMessage(), stunInitServer(), stunNatType(), stunOpenSocket(), and stunServerProcess().
const int STUN_SOCKET_ERROR = -1 [static] |
Definition at line 65 of file stun_udp.h.
Referenced by getMessage(), sendMessage(), and stunNatType().
1.7.1