VR-Link API Documentation for HLA 1.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vlCliServer.h
Go to the documentation of this file.
1 /*********************************************************************
2 ** Copyright (c) 1992-2010 VT MAK
3 ** All rights reserved.
4 *********************************************************************/
9 #pragma once
10 
11 #include <stdio.h>
12 #include <string.h>
13 #include "vlUtil.h"
14 
15 #if DT_HAVE_DAEMON
16 #include "vlShmQueue.h"
17 
18 #include "vlShmReader.h"
19 #include "vlShmWriter.h"
20 #endif
21 
22 #ifdef DtUSE_UTILITIES_NAMESPACE
23 namespace DtUSE_UTILITIES_NAMESPACE
24 {
25 #endif
26 
27 /*****************************************
28  * Constants used by Clients and Servers *
29  *****************************************/
30 
31 #define DtCsClientPathSize 160
32 #define DtCsMaxWarningSize 160
33 
34 #define DtCsVersionApril95 2
35 #define DtCsVersionSeptember95 3
36 #define DtCsVersionCurrent DtCsVersionSeptember95
37 #define DtMinimumSendQSizeSupportedByVers2Server 32
38 
39 #define DtCsClientTypePacket 0
40 #define DtCsClientTypeControl 1
41 
42 #define DtCsUseDefaultSize -1
43 
44 #define DtCsFlagsRead 0x0001
45 #define DtCsFlagsWrite 0x0002
46 #define DtCsFlagsReadWrite (DtCsFlagsRead | DtCsFlagsWrite)
47 
48 #define DtCsFlagsServerChooseDropMode 0x0004
49 #define DtCsFlagsServerDropOldest 0x0008
50 #define DtCsFlagsClientDropOldest 0x0010
51 #define DtCsFlagsDropOldest (DtCsFlagsClientDropOldest | \
52  DtCsFlagsServerDropOldest)
53 
54 #define DtCsFlagsReadResourceWait 0x0020
55 #define DtCsFlagsWriteResourceWait 0x0040
56 #define DtCsFlagsResourceWait (DtCsFlagsReadResourceWait | \
57  DtCsFlagsWriteResourceWait)
58 
59 #define DtCsFlagsDontNotify 0x0080
60 #define DtCsFlagsControlOnly 0x0100
61 
62 
63 /**********************************
64  * Messages from Client to Server *
65  **********************************/
66 
67 
69 
70 #define DtCsMsgWaitingKind 0
71 
73 
74 #define DtCsAddClientKind 1
75 #define DtCsClientPacketKind 2
76 #define DtCsControlReqKind 4
77 #define DtCsFilterKind 5
78 #define DtCsMulticastReqKind 13
79 
80  /**********************************
81  * Types of Control Req Messages *
82  **********************************/
83 
84 #define DtCsCrExternal 0
85 #define DtCsCrInternal 1
86 #define DtCsCrTestClients 2
87 #define DtCsCrPing 3
88 #define DtCsCrState 4
89 #define DtCsCrCState 5
90 #define DtCsCrQuit 6
91 #define DtCsCrDisconnect 7
92 #define DtCsCrUnbundle 8
93 #define DtCsCrNoUnbundle 9
94 
95  /**********************************
96  * Multicast Request Types *
97  **********************************/
98 
99 #define DtCsMSubscribe 0
100 #define DtCsMUnsubscribe 1
101 
102 /**********************************
103  * Messages from Server to Client *
104  **********************************/
105 
106 
107 
109 
110 #define DtCsAckKind 6
111 #define DtCsCliQuotaKind 7
112 
114 
115 #define DtCsServerPacketKind 8
116 #define DtCsStateReturnKind 9
117 #define DtCsCStateReturnKind 10
118 #define DtCsWarningKind 11
119 #define DtCsNoticeKind 12
120 
121  /*****************************
122  * Types of Notice Messages *
123  *****************************/
124 
125 #define DtCsNExternal 0
126 #define DtCsNInternal 1
127 #define DtCsNExtCliQuota 2
128 #define DtCsNPing 3
129 #define DtCsNClosing 4
130 
131 
133 {
136 };
137 
138 /**************************************
139  * Messages sent to Client and Server *
140  **************************************/
141 
144 {
146 };
147 
148 /*******************************
149  * Messages sent to the Server *
150  *******************************/
151 
152 
154 {
160  char clientPath[DtCsClientPathSize];
161 };
162 
165 
167 {
171 };
172 
174 {
178 };
179 
181 {
186 };
187 
188 #define DtCsFilterTypeExercise 0
189 #define DtCsFilterTypeVersion 1
190 #define DtCsFilterTypePduKind 2
191 #define DtCsFilterTypeIpAddr 3
192 
193 #define DtCsFilterOpSetOperator 0
194 #define DtCsFilterOpAddValue 1
195 
196 #define DtCsOperatorEQ 0
197 #define DtCsOperatorNEQ 1
198 
200 {
206 };
207 
208 
209 /*******************************
210  * Messages sent to the Server *
211  *******************************/
212 
213 struct DtCsAck
214 {
216  DtU8 internal;
223 };
224 
227 {
229 };
230 
233 {
235 };
236 
239 
241 {
247 };
248 
250 {
252  DtU8 internal;
258 };
259 
261 
262 #define DtCsCStateServerBlockRead 0x01
263 #define DtCsCStateServerBlockWrite 0x02
264 #define DtCsCStateClientBlockRead 0x04
265 #define DtCsCStateClientBlockWrite 0x08
266 
268 {
275 
278 
281 
284 
287 };
288 
290 {
293  char warningMsg[DtCsMaxWarningSize];
294 };
295 
297 {
300 };
301 
302 
303 union DtCsMsg
304 {
307 
309 
315 
323 };
324 
325 
326 /*
327  *
328  */
329 
331 {
332  public:
335 
336  virtual ~DtClientServerMsg() {}
337 
338  virtual int send() = 0;
339  virtual void print();
340 
341  DtU8 kind() { return msg.hdr.kind; }
342  DtU8 version() { return msg.hdr.version; }
343  size_t msgSize() { return size; }
344 
345  protected:
347  size_t size;
348 
349 };
350 
352 {
353  public:
354  DtSocketMsg(int sockId) { sendFd = sockId; }
355 
356  DtSocketMsg(int sockId, DtCsMsg *m) : DtClientServerMsg(m)
357  { sendFd = sockId; }
358 
359  virtual ~DtSocketMsg() {}
360 
361  virtual int send();
362 
363  private:
364  int sendFd;
365 };
366 
367 #if DT_HAVE_DAEMON
368 class DT_DLL_VLUTIL DtShmMsg : public DtClientServerMsg
369 {
370  public:
371  DtShmMsg(DtShmMsgQueueWriter *w) { writer = w; }
372  DtShmMsg(DtShmMsgQueueWriter *w, DtCsMsg *m) : DtClientServerMsg(m)
373  { writer = w; }
374 
375  virtual ~DtShmMsg() {}
376 
377  virtual int send();
378 
379  protected:
380  DtShmMsgQueueWriter *writer;
381 };
382 #endif
383 
385 {
386  public:
387 
388  DtCsMsgWaitingMsg(int fd, DtCsMsg *m) : DtSocketMsg(fd, m) {}
389 
390  DtCsMsgWaitingMsg(int fd);
391 
392  virtual ~DtCsMsgWaitingMsg() {}
393 };
394 
395 
397 {
398  public:
399 
400  DtCsAddClientMsg(int fd, DtCsMsg *m) : DtSocketMsg(fd, m) {}
401 
402  DtCsAddClientMsg(int fd, DtU16 flgs, DtInt32 s2cSize, DtInt32 c2sSize,
403  DtInt32 pid, char *path);
404 
405  virtual ~DtCsAddClientMsg() {}
406 
407  DtU16 flags() { return msg.addClient.flags; }
408 
409  void setServer2ClientSize(DtU32 s){ msg.addClient.server2ClientSize = s; }
410  DtInt32 server2ClientSize() { return msg.addClient.server2ClientSize; }
411 
412  void setClient2ServerSize(DtU32 s){ msg.addClient.client2ServerSize = s; }
413  DtInt32 client2ServerSize() { return msg.addClient.client2ServerSize; }
414 
415  DtInt32 clientProcessId() { return msg.addClient.clientProcessId; }
416  char *clientPath() { return msg.addClient.clientPath; }
417 };
418 
419 #if DT_HAVE_DAEMON
420 class DT_DLL_VLUTIL DtCsClientPacketMsg : public DtShmMsg
421 {
422  public:
423 
424  DtCsClientPacketMsg(DtShmMsgQueueWriter * w, DtCsMsg *m, char *d)
425  : DtShmMsg(w, m) { theBytes = d; }
426 
427  DtCsClientPacketMsg(DtShmMsgQueueWriter * w, DtU32 length, char *d);
428 
429  virtual ~DtCsClientPacketMsg() {}
430 
431  int send();
432 
433  void setData(char *d) { theBytes = d; };
434  char *data() { return theBytes; }
435 
436  DtU32 length() { return msg.clientPacket.length; }
437  void setLength(DtU32 s) { msg.clientPacket.length = s; };
438 
439  private:
440  char *theBytes;
441 };
442 
443 class DT_DLL_VLUTIL DtCsControlReqMsg : public DtSocketMsg
444 {
445  public:
446 
447  DtCsControlReqMsg(int fd, DtCsMsg *m) : DtSocketMsg(fd, m) {}
448  DtCsControlReqMsg(int fd, DtU16 request, DtU32 clientId);
449 
450  virtual ~DtCsControlReqMsg() {}
451 
452  void setRequest(DtU16 r) { msg.controlReq.request = r; }
453  DtU16 request() { return msg.controlReq.request; }
454  DtU32 clientId() { return msg.controlReq.clientId; }
455  void setClientId(DtU32 id) {msg.controlReq.clientId = id; }
456 };
457 
458 class DT_DLL_VLUTIL DtCsMulticastReqMsg : public DtSocketMsg
459 {
460  public:
461 
462  DtCsMulticastReqMsg(int fd, DtCsMsg *m) : DtSocketMsg(fd, m) {}
463  DtCsMulticastReqMsg(int fd, DtU16 request, DtIpv4Addr addr,
464  DtU32 clientId);
465 
466  virtual ~DtCsMulticastReqMsg() {}
467 
468  void setRequest(DtU16 r) { msg.multicastReq.request = r; }
469  DtU16 request() { return msg.multicastReq.request; }
470  DtU32 clientId() { return msg.multicastReq.clientId; }
471  void setClientId(DtU32 id) {msg.multicastReq.clientId = id; }
472  void setAddr(DtIpv4Addr addr) {msg.multicastReq.addr = (DtU32) addr; }
473  DtIpv4Addr addr() { return (DtIpv4Addr) msg.multicastReq.addr; }
474 };
475 
476 class DT_DLL_VLUTIL DtCsFilterMsg : public DtSocketMsg
477 {
478  public:
479 
480  DtCsFilterMsg(int fd, DtCsMsg *m) : DtSocketMsg(fd, m) {}
481  DtCsFilterMsg(int fd, DtU8 type, DtU8 op, DtU32 val, DtU32 clientId);
482 
483  virtual ~DtCsFilterMsg() {}
484 
485  DtU8 filterType() { return msg.filter.filterType; }
486 
487  DtU8 filterOp() { return msg.filter.filterOp; }
488  void setFilterOp (DtU8 op) { msg.filter.filterOp = op; }
489 
490  DtU32 value() { return msg.filter.value; }
491  void setValue (DtU32 val) { msg.filter.value = val; }
492  DtU32 clientId() {return msg.filter.clientId; }
493  void setClientId(DtU32 id) {msg.filter.clientId = id; }
494 };
495 
496 
497 class DT_DLL_VLUTIL DtCsAckMsg : public DtSocketMsg
498 {
499  public:
500 
501  DtCsAckMsg(int fd, DtCsMsg *m) : DtSocketMsg(fd, m) {}
502 
503  DtCsAckMsg(int fd, DtU8 internal, DtU32 clientId, DtU32 shmKey,
504  DtU32 semKey, DtInt32 server2ClientSize, DtInt32 client2ServerSize);
505 
506  virtual ~DtCsAckMsg() {}
507 
508  DtU8 internal() { return msg.ack.internal; }
509  DtU32 clientId() { return msg.ack.clientId; }
510  DtU32 shmKey() { return msg.ack.shmKey; }
511  DtU32 semKey() { return msg.ack.semKey; }
512  DtInt32 server2ClientSize() { return msg.ack.server2ClientSize; }
513  DtInt32 client2ServerSize() { return msg.ack.client2ServerSize; }
514 
515 };
516 
517 class DT_DLL_VLUTIL DtCsCliQuotaMsg : public DtSocketMsg
518 {
519  public:
520 
521  DtCsCliQuotaMsg(int fd, DtCsMsg *m) : DtSocketMsg(fd, m) {}
522 
523  DtCsCliQuotaMsg(int fd);
524 
525  virtual ~DtCsCliQuotaMsg() {}
526 };
527 
528 class DT_DLL_VLUTIL DtCsServerPacketMsg : public DtShmMsg
529 {
530  public:
531 
532  DtCsServerPacketMsg(DtShmMsgQueueWriter * w, DtCsMsg *m, char *d)
533  : DtShmMsg(w, m) { theBytes = d; }
534 
535  DtCsServerPacketMsg(DtShmMsgQueueWriter * w, DtU32 sourceAddr, DtU32
536  arrivalTime, DtU32 length, char *d);
537 
538  virtual ~DtCsServerPacketMsg() {}
539 
540  int send();
541 
542  void setData(char *d) { theBytes = d; };
543  char *data() { return theBytes; }
544 
545  void setLength(DtU32 s) { msg.serverPacket.length = s; };
546  DtU32 length() { return msg.serverPacket.length; }
547 
548  void setSourceAddr(DtU32 s) { msg.serverPacket.sourceAddr = s; }
549  DtU32 sourceAddr() { return msg.serverPacket.sourceAddr; }
550 
551  void setArrivalTime(DtU32 a) { msg.serverPacket.arrivalTime = a; }
552  DtU32 arrivalTime() { return msg.serverPacket.arrivalTime; }
553 
554  private:
555 
556  char *theBytes;
557 };
558 
559 class DT_DLL_VLUTIL DtCsStateReturnMsg : public DtShmMsg
560 {
561  public:
562 
563  DtCsStateReturnMsg(DtShmMsgQueueWriter * w, DtCsMsg *m) : DtShmMsg(w, m) {}
564 
565  DtCsStateReturnMsg(DtShmMsgQueueWriter * w, DtU8 internal, DtU16
566  numPacketClients, DtU16 numControlClients, DtInt32 clientQuota,
567  DtU32 prt, DtU8 ub);
568 
569  virtual ~DtCsStateReturnMsg() {}
570 
571  void print();
572 
573  DtU8 internal() { return msg.stateReturn.internal; }
574  DtU8 unbundling() { return msg.stateReturn.unbundling; }
575  DtU16 numPacketClients() { return msg.stateReturn.numPacketClients; }
576  DtU16 numControlClients() { return msg.stateReturn.numControlClients; }
577  DtInt32 clientQuota() { return msg.stateReturn.clientQuota; }
578  DtU32 port() { return msg.stateReturn.port; }
579 };
580 
581 class DT_DLL_VLUTIL DtCsCStateReturnMsg : public DtShmMsg
582 {
583  public:
584 
585  DtCsCStateReturnMsg(DtShmMsgQueueWriter * w, DtCsMsg *m) : DtShmMsg(w, m) {}
586 
587  DtCsCStateReturnMsg(DtShmMsgQueueWriter * w, DtU16 flags,
588  DtU8 serverDropOldest, DtU8 serverResourceWait, DtU8 blockFlags,
589  DtInt32 processId, DtU32 clientId, DtInt32 client2ServerSize,
590  DtInt32 server2ClientSize, DtInt32 packetsRcvdFromClient,
591  DtInt32 packetsSendToClient, DtInt32 newPacketsDropped,
592  DtInt32 oldPacketsDropped);
593 
594  virtual ~DtCsCStateReturnMsg() {}
595 
596  void print();
597 
598  DtU16 flags() {return msg.cStateReturn.flags; }
599  DtU8 serverDropOldest() {return msg.cStateReturn.serverDropOldest; }
600  DtU8 serverResourceWait() {return
601  msg.cStateReturn.serverResourceWait; }
602  DtU8 blockFlags() {return msg.cStateReturn.blockFlags; }
603 
604  DtInt32 processId() {return msg.cStateReturn.processId; }
605  DtU32 clientId() {return msg.cStateReturn.clientId; }
606  DtInt32 client2ServerSize() {return msg.cStateReturn.client2ServerSize;}
607  DtInt32 server2ClientSize() {return msg.cStateReturn.server2ClientSize;}
608  DtInt32 packetsRcvdFromClient() {return
609  msg.cStateReturn.packetsRcvdFromClient; }
610  DtInt32 packetsSendToClient() {return
611  msg.cStateReturn.packetsSentToClient; }
612  DtInt32 newPacketsDropped() {return
613  msg.cStateReturn.newPacketsDropped; }
614  DtInt32 oldPacketsDropped() {return
615  msg.cStateReturn.oldPacketsDropped; }
616 };
617 
618 class DT_DLL_VLUTIL DtCsWarningMsg : public DtShmMsg
619 {
620  public:
621 
622  DtCsWarningMsg(DtShmMsgQueueWriter * w, DtCsMsg *m) : DtShmMsg(w, m) {}
623 
624  DtCsWarningMsg(DtShmMsgQueueWriter * w, DtU16 reason, char *warningMsg);
625 
626  virtual ~DtCsWarningMsg() {}
627 
628  void print();
629 
630  DtU16 reason() { return msg.warning.reason; }
631  void setReason (DtU16 r) { msg.warning.reason = r; }
632  char *warningMsg() { return msg.warning.warningMsg; };
633  void setWarningMsg (char *m)
634  { strncpy(msg.warning.warningMsg, m, sizeof(msg.warning.warningMsg)); }
635 };
636 
637 class DT_DLL_VLUTIL DtCsNoticeMsg : public DtShmMsg
638 {
639  public:
640 
641  DtCsNoticeMsg(DtShmMsgQueueWriter * w, DtCsMsg *m) : DtShmMsg(w, m) {}
642 
643  DtCsNoticeMsg(DtShmMsgQueueWriter * w, DtU16 notice);
644 
645  void print();
646 
647  virtual ~DtCsNoticeMsg() {}
648 
649  int notice() { return msg.notice.notice; }
650  void setNotice(DtU16 n) { msg.notice.notice = n; }
651 };
652 #endif
653 
654 /* ---------------------- SUPPORT UTILS ---------------------- */
655 
656 #if DT_HAVE_DAEMON
657 DT_DLL_VLUTIL void DtPacketServerRequestPath(unsigned n, char* requestPath, int vers=DtCsVersionCurrent);
658 
659 #endif
660 
661 /* if who is NULL, warning msgs will not be printed */
663 DT_DLL_VLUTIL int DtOpenUnixDgram(char *path, DtOpenUnixDgramAction action, char *who);
665 
666 #ifdef DtUSE_UTILITIES_NAMESPACE
667 }
668 #endif
669 
670 

Document ID: Generated on Wed Jan 7 13:31:29 EST 2015 from SVN revision 149162
Copyright © 2005-2014 VT MÄK. All Rights Reserved (www.mak.com)