21#include <netinet/in.h>
22#include <sys/socket.h>
38openPort(
unsigned short port,
unsigned int interfaceIp,
bool verbose )
42 fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
46 cerr <<
"Could not create a UDP socket:" << err << endl;
50 struct sockaddr_in addr;
51 memset((
char*) &(addr),0,
sizeof((addr)));
52 addr.sin_family = AF_INET;
53 addr.sin_addr.s_addr = htonl(INADDR_ANY);
54 addr.sin_port = htons(port);
56 if ( (interfaceIp != 0) &&
57 ( interfaceIp != 0x100007f ) )
59 addr.sin_addr.s_addr = htonl(interfaceIp);
62 clog <<
"Binding to interface "
63 << hex <<
"0x" << htonl(interfaceIp) << dec << endl;
67 if ( ::bind( fd,(
struct sockaddr*)&addr,
sizeof(addr)) != 0 )
75 cerr <<
"Could not bind socket" << endl;
81 cerr <<
"Port " << port <<
" for receiving UDP is in use" << endl;
90 cerr <<
"Cannot assign requested address" << endl;
98 cerr <<
"Could not bind UDP receive port"
99 <<
"Error=" << e <<
" " <<
strError(e) << endl;
108 clog <<
"Opened port " << port <<
" with fd " << fd << endl;
119 uint32_t* srcIp,
unsigned short* srcPort,
124 int originalSize = *len;
127 struct sockaddr_in from;
128 int fromLen =
sizeof(from);
134 (
struct sockaddr *)&from,
135 (socklen_t*)&fromLen);
144 cerr <<
"Error fd not a socket" << endl;
147 cerr <<
"Error connection reset - host not reachable" << endl;
151 cerr <<
"Socket Error=" << err << endl;
159 clog <<
"socket closed? negative len" << endl;
165 clog <<
"socket closed? zero len" << endl;
169 *srcPort = ntohs(from.sin_port);
170 *srcIp = ntohl(from.sin_addr.s_addr);
172 if ( (*len)+1 >= originalSize )
176 clog <<
"Received a message that was too large" << endl;
188 unsigned int dstIp,
unsigned short dstPort,
199 s = send(fd,buf,l,0);
206 struct sockaddr_in to;
207 int toLen =
sizeof(to);
210 to.sin_family = AF_INET;
211 to.sin_port = htons(dstPort);
212 to.sin_addr.s_addr = htonl(dstIp);
214 s = sendto(fd, buf, l, 0,(sockaddr*)&to, toLen);
231 cerr <<
"err EAFNOSUPPORT in send" << endl;
236 cerr <<
"err " << e <<
" " <<
strError(e) <<
" in send" << endl;
244 cerr <<
"no data sent in send" << endl;
252 cerr <<
"only " << s <<
" out of " << l <<
" bytes sent" << endl;
#define resip_assert(x)
This file needs to work for both C and C++ code.
resip::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!...
bool getMessage(resip::Socket fd, char *buf, int *len, uint32_t *srcIp, unsigned short *srcPort, bool verbose)
recive a UDP message
bool sendMessage(resip::Socket fd, char *buf, int l, unsigned int dstIp, unsigned short dstPort, bool verbose)
send a UDP message
dcm! – add UnusedChecking(_enum) below;
int closeSocket(Socket fd)
std::string strError(int err)