-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathDatagramSocket.cpp
More file actions
101 lines (85 loc) · 2.51 KB
/
DatagramSocket.cpp
File metadata and controls
101 lines (85 loc) · 2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "DatagramSocket.h"
#ifdef WIN32
typedef int socklen_t;
#endif
DatagramSocket::DatagramSocket(int port, char* address, bool broadcast, bool reusesock)
{
#ifdef WIN32
retval = WSAStartup(MAKEWORD(2,2),&wsaData);
#endif
sockaddr_in addr;
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//set up bind address
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
//set up address to use for sending
memset(&outaddr,0,sizeof(outaddr));
outaddr.sin_family = AF_INET;
outaddr.sin_addr.s_addr = inet_addr(address);
outaddr.sin_port = htons(port);
#ifdef WIN32
bool bOptVal = 1;
int bOptLen = sizeof(bool);
#else
int OptVal = 1;
#endif
if (broadcast)
#ifdef WIN32
retval = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, bOptLen);
#else
retval = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &OptVal, sizeof(OptVal));
#endif
if (reusesock)
#ifdef WIN32
retval = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptVal, bOptLen);
#else
retval = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &OptVal, sizeof(OptVal));
#endif
retval = bind(sock,(struct sockaddr *)&addr,sizeof(addr));
}
DatagramSocket::~DatagramSocket()
{
#if WIN32
closesocket(sock);
WSACleanup();
#else
close(sock);
#endif
}
int DatagramSocket::getAddress(const char * name, char * addr)
{
struct hostent *hp;
if ((hp = gethostbyname(name)) == NULL) return (0);
strcpy(addr, inet_ntoa( *( struct in_addr*)( hp->h_addr)));
return (1);
}
const char* DatagramSocket::getAddress(const char * name)
{
struct hostent *hp;
if ((hp = gethostbyname(name)) == NULL) return (0);
strcpy(ip, inet_ntoa( *( struct in_addr*)( hp->h_addr)));
return ip;
}
long DatagramSocket::receive(char* msg, int msgsize)
{
struct sockaddr_in sender;
socklen_t sendersize = sizeof(sender);
int retval = recvfrom(sock,msg,msgsize,0, (struct sockaddr *)&sender, &sendersize);
strcpy(received,inet_ntoa(sender.sin_addr));
return retval;
}
char* DatagramSocket::received_from()
{
return received;
}
long DatagramSocket::send(const char* msg, int msgsize)
{
return sendto(sock, msg, msgsize, 0, (struct sockaddr *)&outaddr,sizeof(outaddr));
}
long DatagramSocket::sendTo(const char* msg, int msgsize, const char* addr)
{
outaddr.sin_addr.s_addr = inet_addr(addr);
return sendto(sock, msg, msgsize, 0, (struct sockaddr *)&outaddr,sizeof(outaddr));
}