udp.cc
Go to the documentation of this file.00001 #include <cassert>
00002 #include <cstdio>
00003 #include <cstring>
00004 #include <errno.h>
00005 #include <iostream>
00006 #include <cstdlib>
00007 #include <time.h>
00008
00009 #ifdef WIN32
00010
00011 #include <winsock2.h>
00012 #include <stdlib.h>
00013 #include <io.h>
00014
00015 #else
00016
00017 #include <arpa/inet.h>
00018 #include <stdlib.h>
00019 #include <unistd.h>
00020 #include <fcntl.h>
00021 #include <netinet/in.h>
00022 #include <sys/socket.h>
00023 #include <sys/types.h>
00024 #include <netdb.h>
00025 #include <string.h>
00026 #include <unistd.h>
00027
00028 #endif
00029
00030 #include <string.h>
00031
00032 #include "stun_udp.h"
00033
00034 using namespace std;
00035
00036
00037 Socket
00038 openPort( unsigned short port, unsigned int interfaceIp, bool verbose )
00039 {
00040 Socket fd;
00041
00042 fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
00043 if ( fd == STUN_INVALID_SOCKET )
00044 {
00045 int err = getErrno();
00046 cerr << "Could not create a UDP socket:" << err << endl;
00047 return STUN_INVALID_SOCKET;
00048 }
00049
00050 struct sockaddr_in addr;
00051 memset((char*) &(addr),0, sizeof((addr)));
00052 addr.sin_family = AF_INET;
00053 addr.sin_addr.s_addr = htonl(INADDR_ANY);
00054 addr.sin_port = htons(port);
00055
00056 if ( (interfaceIp != 0) &&
00057 ( interfaceIp != 0x100007f ) )
00058 {
00059 addr.sin_addr.s_addr = htonl(interfaceIp);
00060 if (verbose )
00061 {
00062 clog << "Binding to interface "
00063 << hex << "0x" << htonl(interfaceIp) << dec << endl;
00064 }
00065 }
00066
00067 if ( bind( fd,(struct sockaddr*)&addr, sizeof(addr)) != 0 )
00068 {
00069 int e = getErrno();
00070
00071 switch (e)
00072 {
00073 case 0:
00074 {
00075 cerr << "Could not bind socket" << endl;
00076 return STUN_INVALID_SOCKET;
00077 }
00078 case EADDRINUSE:
00079 {
00080 cerr << "Port " << port << " for receiving UDP is in use" << endl;
00081 return STUN_INVALID_SOCKET;
00082 }
00083 break;
00084 case EADDRNOTAVAIL:
00085 {
00086 if ( verbose )
00087 {
00088 cerr << "Cannot assign requested address" << endl;
00089 }
00090 return STUN_INVALID_SOCKET;
00091 }
00092 break;
00093 default:
00094 {
00095 cerr << "Could not bind UDP receive port"
00096 << "Error=" << e << " " << strerror(e) << endl;
00097 return STUN_INVALID_SOCKET;
00098 }
00099 break;
00100 }
00101 }
00102 if ( verbose )
00103 {
00104 clog << "Opened port " << port << " with fd " << fd << endl;
00105 }
00106
00107 assert( fd != STUN_INVALID_SOCKET );
00108
00109 return fd;
00110 }
00111
00112
00113 bool
00114 getMessage( Socket fd, char* buf, int* len,
00115 unsigned int* srcIp, unsigned short* srcPort,
00116 bool verbose)
00117 {
00118 assert( fd != STUN_INVALID_SOCKET );
00119
00120 int originalSize = *len;
00121 assert( originalSize > 0 );
00122
00123 struct sockaddr_in from;
00124 int fromLen = sizeof(from);
00125
00126 *len = recvfrom(fd,
00127 buf,
00128 originalSize,
00129 0,
00130 (struct sockaddr *)&from,
00131 (socklen_t*)&fromLen);
00132
00133 if ( *len == STUN_SOCKET_ERROR )
00134 {
00135 int err = getErrno();
00136
00137 switch (err)
00138 {
00139 case ENOTSOCK:
00140 cerr << "Error fd not a socket" << endl;
00141 break;
00142 case ECONNRESET:
00143 cerr << "Error connection reset - host not reachable" << endl;
00144 break;
00145
00146 default:
00147 cerr << "Socket Error=" << err << endl;
00148 }
00149
00150 return false;
00151 }
00152
00153 if ( *len < 0 )
00154 {
00155 clog << "socket closed? negative len" << endl;
00156 return false;
00157 }
00158
00159 if ( *len == 0 )
00160 {
00161 clog << "socket closed? zero len" << endl;
00162 return false;
00163 }
00164
00165 *srcPort = ntohs(from.sin_port);
00166 *srcIp = ntohl(from.sin_addr.s_addr);
00167
00168 if ( (*len)+1 >= originalSize )
00169 {
00170 if (verbose)
00171 {
00172 clog << "Received a message that was too large" << endl;
00173 }
00174 return false;
00175 }
00176 buf[*len]=0;
00177
00178 return true;
00179 }
00180
00181
00182 bool
00183 sendMessage( Socket fd, char* buf, int l,
00184 unsigned int dstIp, unsigned short dstPort,
00185 bool verbose)
00186 {
00187 assert( fd != STUN_INVALID_SOCKET );
00188
00189 int s;
00190 if ( dstPort == 0 )
00191 {
00192
00193 assert( dstIp == 0 );
00194
00195 s = send(fd,buf,l,0);
00196 }
00197 else
00198 {
00199 assert( dstIp != 0 );
00200 assert( dstPort != 0 );
00201
00202 struct sockaddr_in to;
00203 int toLen = sizeof(to);
00204 memset(&to,0,toLen);
00205
00206 to.sin_family = AF_INET;
00207 to.sin_port = htons(dstPort);
00208 to.sin_addr.s_addr = htonl(dstIp);
00209
00210 s = sendto(fd, buf, l, 0,(sockaddr*)&to, toLen);
00211 }
00212
00213 if ( s == STUN_SOCKET_ERROR )
00214 {
00215 int e = getErrno();
00216 switch (e)
00217 {
00218 case ECONNREFUSED:
00219 case EHOSTDOWN:
00220 case EHOSTUNREACH:
00221 {
00222
00223 }
00224 break;
00225 case EAFNOSUPPORT:
00226 {
00227 cerr << "err EAFNOSUPPORT in send" << endl;
00228 }
00229 break;
00230 default:
00231 {
00232 cerr << "err " << e << " " << strerror(e) << " in send" << endl;
00233 }
00234 }
00235 return false;
00236 }
00237
00238 if ( s == 0 )
00239 {
00240 cerr << "no data sent in send" << endl;
00241 return false;
00242 }
00243
00244 if ( s != l )
00245 {
00246 if (verbose)
00247 {
00248 cerr << "only " << s << " out of " << l << " bytes sent" << endl;
00249 }
00250 return false;
00251 }
00252
00253 return true;
00254 }
00255
00256
00257 void
00258 initNetwork()
00259 {
00260 #ifdef WIN32
00261 WORD wVersionRequested = MAKEWORD( 2, 2 );
00262 WSADATA wsaData;
00263 int err;
00264
00265 err = WSAStartup( wVersionRequested, &wsaData );
00266 if ( err != 0 )
00267 {
00268
00269 cerr << "Could not load winsock" << endl;
00270 assert(0);
00271 exit(1);
00272 }
00273
00274
00275
00276
00277
00278
00279
00280 if ( LOBYTE( wsaData.wVersion ) != 2 ||
00281 HIBYTE( wsaData.wVersion ) != 2 )
00282 {
00283
00284
00285 WSACleanup( );
00286 cerr << "Bad winsock verion" << endl;
00287 assert(0);
00288 exit(1);
00289 }
00290 #endif
00291 }
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349