10#include "Component_DIS.h"
16 #ifndef WIN32_LEAN_AND_MEAN
17 #define WIN32_LEAN_AND_MEAN
19 #define strdup _strdup
22 #define SHUT_RDWR SD_BOTH
24 #define snprintf _snprintf
26 #define STRTOK_S strtok_s
29char* ErrorString(DWORD err)
34 if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
35 FORMAT_MESSAGE_FROM_SYSTEM,
44 static char * unk =
"unknown error";
49 char* p = strchr(s,
'\r');
59void print_socket_error(
char *message,
int error){
60 int lasterror = WSAGetLastError();
61 printf(
"%s %d ",message,lasterror);
62 printf(
" %s \n",ErrorString(lasterror));
66 #include <sys/ioctl.h>
67 #include <sys/socket.h>
68 #include <netinet/in.h>
69 #include <arpa/inet.h>
73 #define ioctlsocket ioctl
75 #define SOCKET_ERROR SO_ERROR
76 #define STRTOK_S strtok_r
77void print_socket_error(
char *message,
int error){
78 printf(
"%s %d \n",message,error);
85#define strcasecmp _stricmp
87void initialize_sockets(){
90 iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
92 printf(
"WSAStartup failed: %d\n", iResult);
96void initialize_sockets(){}
105 struct sockaddr_in saddr;
106 int multicastRelayPort;
107 char *multicastRelayHost;
109 struct Vector *registered;
118int sockwrite(SOCKET s,
char *buf,
int len){
119 return send(s,buf,len,0);
121int sockread(SOCKET s,
char *buf,
int len){
122 return recv(s,buf,len,0);
125int socksendto(
struct dis_socket *dsock,
char *buf,
int len){
127 if( iret = sendto(dsock->socket, buf, len, 0,
128 (
struct sockaddr *)&dsock->saddr,
sizeof(
struct sockaddr)) == SOCKET_ERROR){
129 printf(
"sendto failed with error %d\n", WSAGetLastError());
134int sockrecvfrom(
struct dis_socket *dsock,
char *buf,
int len){
137 fromlen =
sizeof(
struct sockaddr);
138 status = recvfrom(dsock->socket, buf, len, 0,
139 (
struct sockaddr *)&dsock->saddr, &fromlen );
146int sockwrite(SOCKET s,
const char *buf,
int len){
147 return write(s,buf,len);
149int sockread(SOCKET s,
char *buf,
int len){
150 return recv(s,buf,len,0);
153int socksendto(
struct dis_socket *dsock,
char *buf,
int len){
155 if( iret = sendto(dsock->socket, buf, len, 0,
156 (
struct sockaddr *)&dsock->saddr,
sizeof(
struct sockaddr)) == SOCKET_ERROR){
157 printf(
"sendto failed with error %d\n", errno);
162int sockrecvfrom(
struct dis_socket *dsock,
char *buf,
int len){
165 fromlen =
sizeof(
struct sockaddr);
166 status = recvfrom(dsock->socket, buf, len, 0,
167 (
struct sockaddr *)&dsock->saddr, (socklen_t *)&fromlen );
180 int nbytes, npdus, addrlen, on=1;
183 initialize_sockets();
184 if(dsock->idir == 1){
189 sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
191 setsockopt(sock, SOL_SOCKET,SO_REUSEADDR, (
const char *)&on,
sizeof(
int));
192 if( ier = ioctlsocket(sock, FIONBIO, (
unsigned long *)&on) < 0)
194 print_socket_error(
"setting to nonblock failed",ier);
197 memset(&dsock->saddr,0,
sizeof(
struct sockaddr_in));
198 dsock->saddr.sin_family=AF_INET;
199 dsock->saddr.sin_addr.s_addr=htonl(INADDR_ANY);
200 dsock->saddr.sin_port=htons(dsock->port);
203 if (bind(sock,(
struct sockaddr *) &dsock->saddr,
sizeof(
struct sockaddr_in)) < 0) {
206 printf(
"wsagetlasterror= %d\n",WSAGetLastError());
210 mreq.imr_multiaddr.s_addr=inet_addr(dsock->address);
211 mreq.imr_interface.s_addr=htonl(INADDR_ANY);
212 if (setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(
char*)&mreq,
sizeof(mreq)) < 0) {
214 printf(
"setsockopt0 ");
217 printf(
"wsagetlasterror= %d\n",WSAGetLastError());
218 errstr = ErrorString(WSAGetLastError());
224 printf(
"opened recv port\n");
225 dsock->socket = sock;
226 }
else if(dsock->idir == 2){
232 struct in_addr iaddr;
233 unsigned char ttl = 3;
234 unsigned char one = 1;
237 memset(&dsock->saddr, 0,
sizeof(
struct sockaddr_in));
238 memset(&iaddr, 0,
sizeof(
struct in_addr));
241 sockout = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
243 printf(
"Error creating socket");
245 printf(
"%d\n",WSAGetLastError());
250 dsock->saddr.sin_family = PF_INET;
251 dsock->saddr.sin_port = htons(0);
252 dsock->saddr.sin_addr.s_addr = htonl(INADDR_ANY);
254 if( bind(sockout, (
struct sockaddr *)&dsock->saddr,
sizeof(
struct sockaddr_in)) == SOCKET_ERROR){
255 printf(
"Error binding socket to interface");
257 printf(
"%d\n",WSAGetLastError());
262 iaddr.s_addr = INADDR_ANY;
265 if( setsockopt(sockout, IPPROTO_IP, IP_MULTICAST_IF, (
const char*) &iaddr,
266 sizeof(
struct in_addr)) == SOCKET_ERROR){
267 printf(
"sockopt1 erro");
269 printf(
"%d\n",WSAGetLastError());
275 if( setsockopt(sockout, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,
276 sizeof(
unsigned char)) == SOCKET_ERROR){
277 printf(
"sockopt2 error");
279 printf(
"%d\n",WSAGetLastError());
283 if( setsockopt(sockout, IPPROTO_IP, IP_MULTICAST_LOOP,
284 &one,
sizeof(
unsigned char)) == SOCKET_ERROR){
285 printf(
"sockopt3 error");
287 printf(
"%d\n",WSAGetLastError());
291 if( bind(sockout, (
struct sockaddr *)&dsock->saddr,
sizeof(
struct sockaddr_in)) == SOCKET_ERROR){
292 printf(
"Error binding socket to interface");
294 printf(
"%d\n",WSAGetLastError());
299 dsock->saddr.sin_family = PF_INET;
300 dsock->saddr.sin_addr.s_addr = inet_addr(dsock->address);
301 dsock->saddr.sin_port = htons(dsock->port);
303 if( bind(sockout, (
struct sockaddr *)&dsock->saddr,
sizeof(
struct sockaddr_in)) == SOCKET_ERROR){
304 printf(
"Error binding socket to interface");
306 printf(
"%d\n",WSAGetLastError());
309 dsock->socket = sockout;
310 printf(
"opened send port\n");