Skip to content
Snippets Groups Projects
Commit b6fc0ee7 authored by Emmanuel Milou's avatar Emmanuel Milou
Browse files

[#2174] Remove voviva stun code

parent 4e10f58e
No related branches found
No related tags found
No related merge requests found
/* ====================================================================
* The Vovida Software License, Version 1.0
*
* Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The names "VOCAL", "Vovida Open Communication Application Library",
* and "Vovida Open Communication Application Library (VOCAL)" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact vocal@vovida.org.
*
* 4. Products derived from this software may not be called "VOCAL", nor
* may "VOCAL" appear in their name, without prior written
* permission of Vovida Networks, Inc.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
* NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
* IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by Vovida
* Networks, Inc. and many individuals on behalf of Vovida Networks,
* Inc. For more information on Vovida Networks, Inc., please see
* <http://www.vovida.org/>.
*
*/
noinst_LTLIBRARIES = libstun.la
libstun_la_SOURCES = \
stun.cxx stun.h \
udp.cxx udp.h
\ No newline at end of file
This diff is collapsed.
/* ====================================================================
* The Vovida Software License, Version 1.0
*
* Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The names "VOCAL", "Vovida Open Communication Application Library",
* and "Vovida Open Communication Application Library (VOCAL)" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact vocal@vovida.org.
*
* 4. Products derived from this software may not be called "VOCAL", nor
* may "VOCAL" appear in their name, without prior written
* permission of Vovida Networks, Inc.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
* NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
* IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by Vovida
* Networks, Inc. and many individuals on behalf of Vovida Networks,
* Inc. For more information on Vovida Networks, Inc., please see
* <http://www.vovida.org/>.
*
*/
#ifndef STUN_H
#define STUN_H
#include <iostream>
#include <time.h>
#include "udp.h"
// if you change this version, change in makefile too
#define STUN_VERSION "0.94"
#define STUN_MAX_STRING 256
#define STUN_MAX_UNKNOWN_ATTRIBUTES 8
#define STUN_MAX_MESSAGE_SIZE 2048
#define STUN_PORT 3478
// define some basic types
typedef unsigned char UInt8;
typedef unsigned short UInt16;
typedef unsigned int UInt32;
#if defined( WIN32 )
typedef unsigned __int64 UInt64;
#else
typedef unsigned long long UInt64;
#endif
typedef struct { unsigned char octet[16]; } UInt128;
/// define a structure to hold a stun address
const UInt8 IPv4Family = 0x01;
const UInt8 IPv6Family = 0x02;
// define flags
const UInt32 ChangeIpFlag = 0x04;
const UInt32 ChangePortFlag = 0x02;
// define stun attribute
const UInt16 MappedAddress = 0x0001;
const UInt16 ResponseAddress = 0x0002;
const UInt16 ChangeRequest = 0x0003;
const UInt16 SourceAddress = 0x0004;
const UInt16 ChangedAddress = 0x0005;
const UInt16 Username = 0x0006;
const UInt16 Password = 0x0007;
const UInt16 MessageIntegrity = 0x0008;
const UInt16 ErrorCode = 0x0009;
const UInt16 UnknownAttribute = 0x000A;
const UInt16 ReflectedFrom = 0x000B;
const UInt16 XorMappedAddress = 0x0020;
const UInt16 XorOnly = 0x0021;
const UInt16 ServerName = 0x0022;
const UInt16 SecondaryAddress = 0x0050; // Non standard extention
// define types for a stun message
const UInt16 BindRequestMsg = 0x0001;
const UInt16 BindResponseMsg = 0x0101;
const UInt16 BindErrorResponseMsg = 0x0111;
const UInt16 SharedSecretRequestMsg = 0x0002;
const UInt16 SharedSecretResponseMsg = 0x0102;
const UInt16 SharedSecretErrorResponseMsg = 0x0112;
typedef struct
{
UInt16 msgType;
UInt16 msgLength;
UInt128 id;
} StunMsgHdr;
typedef struct
{
UInt16 type;
UInt16 length;
} StunAtrHdr;
typedef struct
{
UInt16 port;
UInt32 addr;
} StunAddress4;
typedef struct
{
UInt8 pad;
UInt8 family;
StunAddress4 ipv4;
} StunAtrAddress4;
typedef struct
{
UInt32 value;
} StunAtrChangeRequest;
typedef struct
{
UInt16 pad; // all 0
UInt8 errorClass;
UInt8 number;
char reason[STUN_MAX_STRING];
UInt16 sizeReason;
} StunAtrError;
typedef struct
{
UInt16 attrType[STUN_MAX_UNKNOWN_ATTRIBUTES];
UInt16 numAttributes;
} StunAtrUnknown;
typedef struct
{
char value[STUN_MAX_STRING];
UInt16 sizeValue;
} StunAtrString;
typedef struct
{
char hash[20];
} StunAtrIntegrity;
typedef enum
{
HmacUnkown=0,
HmacOK,
HmacBadUserName,
HmacUnkownUserName,
HmacFailed,
} StunHmacStatus;
typedef struct
{
StunMsgHdr msgHdr;
bool hasMappedAddress;
StunAtrAddress4 mappedAddress;
bool hasResponseAddress;
StunAtrAddress4 responseAddress;
bool hasChangeRequest;
StunAtrChangeRequest changeRequest;
bool hasSourceAddress;
StunAtrAddress4 sourceAddress;
bool hasChangedAddress;
StunAtrAddress4 changedAddress;
bool hasUsername;
StunAtrString username;
bool hasPassword;
StunAtrString password;
bool hasMessageIntegrity;
StunAtrIntegrity messageIntegrity;
bool hasErrorCode;
StunAtrError errorCode;
bool hasUnknownAttributes;
StunAtrUnknown unknownAttributes;
bool hasReflectedFrom;
StunAtrAddress4 reflectedFrom;
bool hasXorMappedAddress;
StunAtrAddress4 xorMappedAddress;
bool xorOnly;
bool hasServerName;
StunAtrString serverName;
bool hasSecondaryAddress;
StunAtrAddress4 secondaryAddress;
} StunMessage;
// Define enum with different types of NAT
typedef enum
{
StunTypeUnknown=0,
StunTypeOpen,
StunTypeConeNat,
StunTypeRestrictedNat,
StunTypePortRestrictedNat,
StunTypeSymNat,
StunTypeSymFirewall,
StunTypeBlocked,
StunTypeFailure
} NatType;
#ifdef WIN32
typedef SOCKET Socket;
#else
#endif
#define MAX_MEDIA_RELAYS 500
#define MAX_RTP_MSG_SIZE 1500
#define MEDIA_RELAY_TIMEOUT 3*60
typedef struct
{
int relayPort; // media relay port
int fd; // media relay file descriptor
StunAddress4 destination; // NAT IP:port
time_t expireTime; // if no activity after time, close the socket
} StunMediaRelay;
typedef struct
{
StunAddress4 myAddr;
StunAddress4 altAddr;
Socket myFd;
Socket altPortFd;
Socket altIpFd;
Socket altIpPortFd;
bool relay; // true if media relaying is to be done
StunMediaRelay relays[MAX_MEDIA_RELAYS];
} StunServerInfo;
bool
stunParseMessage( char* buf,
unsigned int bufLen,
StunMessage& message,
bool verbose );
void
stunBuildReqSimple( StunMessage* msg,
const StunAtrString& username,
bool changePort, bool changeIp, unsigned int id=0 );
unsigned int
stunEncodeMessage( const StunMessage& message,
char* buf,
unsigned int bufLen,
const StunAtrString& password,
bool verbose);
void
stunCreateUserName(const StunAddress4& addr, StunAtrString* username);
void
stunGetUserNameAndPassword( const StunAddress4& dest,
StunAtrString* username,
StunAtrString* password);
void
stunCreatePassword(const StunAtrString& username, StunAtrString* password);
int
stunRand();
UInt64
stunGetSystemTimeSecs();
/// find the IP address of a the specified stun server - return false is fails parse
bool
stunParseServerName( char* serverName, StunAddress4& stunServerAddr);
bool
stunParseHostName( char* peerName,
UInt32& ip,
UInt16& portVal,
UInt16 defaultPort );
/// return true if all is OK
/// Create a media relay and do the STERN thing if startMediaPort is non-zero
bool
stunInitServer(StunServerInfo& info,
const StunAddress4& myAddr,
const StunAddress4& altAddr,
int startMediaPort,
bool verbose);
void
stunStopServer(StunServerInfo& info);
/// return true if all is OK
bool
stunServerProcess(StunServerInfo& info, bool verbose);
/// returns number of address found - take array or addres
int
stunFindLocalInterfaces(UInt32* addresses, int maxSize );
void
stunTest( StunAddress4& dest, int testNum, bool verbose, StunAddress4* srcAddr=0 );
NatType
stunNatType( StunAddress4& dest, bool verbose,
bool* preservePort=0, // if set, is return for if NAT preservers ports or not
bool* hairpin=0 , // if set, is the return for if NAT will hairpin packets
int port=0, // port to use for the test, 0 to choose random port
StunAddress4* sAddr=0 // NIC to use
);
/// prints a StunAddress
std::ostream&
operator<<( std::ostream& strm, const StunAddress4& addr);
std::ostream&
operator<< ( std::ostream& strm, const UInt128& );
bool
stunServerProcessMsg( char* buf,
unsigned int bufLen,
StunAddress4& from,
StunAddress4& myAddr,
StunAddress4& altAddr,
StunMessage* resp,
StunAddress4* destination,
StunAtrString* hmacPassword,
bool* changePort,
bool* changeIp,
bool verbose);
int
stunOpenSocket( StunAddress4& dest,
StunAddress4* mappedAddr,
int port=0,
StunAddress4* srcAddr=0,
bool verbose=false );
bool
stunOpenSocketPair( StunAddress4& dest, StunAddress4* mappedAddr,
int* fd1, int* fd2,
int srcPort=0, StunAddress4* srcAddr=0,
bool verbose=false);
#endif
// Local Variables:
// mode:c++
// c-file-style:"ellemtel"
// c-file-offsets:((case-label . +))
// indent-tabs-mode:nil
// End:
/* ====================================================================
* The Vovida Software License, Version 1.0
*
* Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The names "VOCAL", "Vovida Open Communication Application Library",
* and "Vovida Open Communication Application Library (VOCAL)" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact vocal@vovida.org.
*
* 4. Products derived from this software may not be called "VOCAL", nor
* may "VOCAL" appear in their name, without prior written
* permission of Vovida Networks, Inc.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
* NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
* IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by Vovida
* Networks, Inc. and many individuals on behalf of Vovida Networks,
* Inc. For more information on Vovida Networks, Inc., please see
* <http://www.vovida.org/>.
*
*/
#include <cassert>
#include <cstdio>
#include <cstring>
#include <errno.h>
#include <iostream>
#include <cstdlib>
#include <time.h>
#ifdef WIN32
#include <winsock2.h>
#include <stdlib.h>
#include <io.h>
#else
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#endif
#include <string.h>
#include "udp.h"
using namespace std;
Socket
openPort( unsigned short port, unsigned int interfaceIp, bool verbose )
{
Socket fd;
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if ( fd == INVALID_SOCKET )
{
int err = getErrno();
cerr << "Could not create a UDP socket:" << err << endl;
return 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 INVALID_SOCKET;
}
case EADDRINUSE:
{
cerr << "Port " << port << " for receiving UDP is in use" << endl;
return INVALID_SOCKET;
}
break;
case EADDRNOTAVAIL:
{
if ( verbose )
{
cerr << "Cannot assign requested address" << endl;
}
return INVALID_SOCKET;
}
break;
default:
{
cerr << "Could not bind UDP receive port"
<< "Error=" << e << " " << strerror(e) << endl;
return INVALID_SOCKET;
}
break;
}
}
if ( verbose )
{
clog << "Opened port " << port << " with fd " << fd << endl;
}
assert( fd != INVALID_SOCKET );
return fd;
}
bool
getMessage( Socket fd, char* buf, int* len,
unsigned int* srcIp, unsigned short* srcPort,
bool verbose)
{
assert( fd != 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 == 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;
}
bool
sendMessage( Socket fd, char* buf, int l,
unsigned int dstIp, unsigned short dstPort,
bool verbose)
{
assert( fd != 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 == 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;
}
void
initNetwork()
{
#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
}
// Local Variables:
// mode:c++
// c-file-style:"ellemtel"
// c-file-offsets:((case-label . +))
// indent-tabs-mode:nil
// End:
/* ====================================================================
* The Vovida Software License, Version 1.0
*
* Copyright (c) 2000 Vovida Networks, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The names "VOCAL", "Vovida Open Communication Application Library",
* and "Vovida Open Communication Application Library (VOCAL)" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact vocal@vovida.org.
*
* 4. Products derived from this software may not be called "VOCAL", nor
* may "VOCAL" appear in their name, without prior written
* permission of Vovida Networks, Inc.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA
* NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
* IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by Vovida
* Networks, Inc. and many individuals on behalf of Vovida Networks,
* Inc. For more information on Vovida Networks, Inc., please see
* <http://www.vovida.org/>.
*
*/
#ifndef udp_h
#define udp_h
#ifdef __MACH__
typedef int socklen_t;
#endif
#include <errno.h>
#ifdef WIN32
#include <winsock2.h>
#include <io.h>
typedef int socklen_t;
typedef SOCKET Socket;
#define EWOULDBLOCK WSAEWOULDBLOCK
#define EINPROGRESS WSAEINPROGRESS
#define EALREADY WSAEALREADY
#define ENOTSOCK WSAENOTSOCK
#define EDESTADDRREQ WSAEDESTADDRREQ
#define EMSGSIZE WSAEMSGSIZE
#define EPROTOTYPE WSAEPROTOTYPE
#define ENOPROTOOPT WSAENOPROTOOPT
#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
#define EOPNOTSUPP WSAEOPNOTSUPP
#define EPFNOSUPPORT WSAEPFNOSUPPORT
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#define EADDRINUSE WSAEADDRINUSE
#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
#define ENETDOWN WSAENETDOWN
#define ENETUNREACH WSAENETUNREACH
#define ENETRESET WSAENETRESET
#define ECONNABORTED WSAECONNABORTED
#define ECONNRESET WSAECONNRESET
#define ENOBUFS WSAENOBUFS
#define EISCONN WSAEISCONN
#define ENOTCONN WSAENOTCONN
#define ESHUTDOWN WSAESHUTDOWN
#define ETOOMANYREFS WSAETOOMANYREFS
#define ETIMEDOUT WSAETIMEDOUT
#define ECONNREFUSED WSAECONNREFUSED
#define ELOOP WSAELOOP
#define EHOSTDOWN WSAEHOSTDOWN
#define EHOSTUNREACH WSAEHOSTUNREACH
#define EPROCLIM WSAEPROCLIM
#define EUSERS WSAEUSERS
#define EDQUOT WSAEDQUOT
#define ESTALE WSAESTALE
#define EREMOTE WSAEREMOTE
typedef LONGLONG Int64;
inline int getErrno() { return WSAGetLastError(); }
#else
//typedef int Socket;
#define Socket int
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
inline int closesocket( int fd ) { return close(fd); };
inline int getErrno() { return errno; }
#define WSANOTINITIALISED EPROTONOSUPPORT
#endif
/// 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
int
openPort( unsigned short port, unsigned int interfaceIp,
bool verbose);
/// recive a UDP message
bool
getMessage( int fd, char* buf, int* len,
unsigned int* srcIp, unsigned short* srcPort,
bool verbose);
/// send a UDP message
bool
sendMessage( int fd, char* msg, int len,
unsigned int dstIp, unsigned short dstPort,
bool verbose);
/// set up network - does nothing in unix but needed for windows
void
initNetwork();
// Local Variables:
// mode:c++
// c-file-style:"ellemtel"
// c-file-offsets:((case-label . +))
// indent-tabs-mode:nil
// End:
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment