better port management

pull/5/head
Tom Early 8 years ago
parent 05784268d5
commit b3c8755658

@ -42,15 +42,17 @@ using namespace libconfig;
#define VERSION "v3.1" #define VERSION "v3.1"
int sockDst = -1; int sockFrm = -1;
struct sockaddr_in toDst;
FILE *fp = NULL; FILE *fp = NULL;
time_t tNow = 0; time_t tNow = 0;
short streamid_raw = 0; unsigned short streamid_raw = 0U;
int moduleport[3] = { 0, 0, 0 }; int moduleport[3] = { 0, 0, 0 };
std::string moduleip[3]; std::string moduleip[3];
std::string REPEATER; std::string REPEATER;
int PORT, PLAY_WAIT, PLAY_DELAY; std::string FROM_ADDRESS;
int FROM_PORT;
int PLAY_WAIT, PLAY_DELAY;
bool is_icom = false; bool is_icom = false;
unsigned short crc_tabccitt[256] = { unsigned short crc_tabccitt[256] = {
@ -94,41 +96,43 @@ void calcPFCS(unsigned char rawbytes[58])
} }
bool dst_open(const char *ip, const short port) bool dst_open(const char *ip, const unsigned short int port)
{ {
sockDst = socket(PF_INET,SOCK_DGRAM,0); sockFrm = socket(PF_INET,SOCK_DGRAM,0);
if (sockDst == -1) { if (sockFrm == -1) {
printf("Failed to create DSTAR socket\n"); printf("Failed to create DSTAR socket\n");
return true; return true;
} }
fcntl(sockDst,F_SETFL,O_NONBLOCK); fcntl(sockFrm,F_SETFL,O_NONBLOCK);
int reuse = 1; int reuse = 1;
if (setsockopt(sockDst,SOL_SOCKET,SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) == -1) { if (setsockopt(sockFrm,SOL_SOCKET,SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) == -1) {
close(sockDst); close(sockFrm);
sockDst = -1; sockFrm = -1;
printf("setsockopt DSTAR REUSE failed\n"); printf("setsockopt DSTAR REUSE failed\n");
return true; return true;
} }
memset(&toDst,0,sizeof(struct sockaddr_in));
toDst.sin_family = AF_INET; struct sockaddr_in fromAddr;
toDst.sin_port = htons(port); memset(&fromAddr, 0, sizeof(struct sockaddr_in));
toDst.sin_addr.s_addr = inet_addr(ip); fromAddr.sin_family = AF_INET;
fromAddr.sin_port = htons(port);
// if (bind(sockDst, (struct sockaddr *)&toDst, sizeof(struct sockaddr_in)) != 0) { fromAddr.sin_addr.s_addr = inet_addr(ip);
// printf("Failed to bind %s:%d, errno=%d, %s\n", ip, port, errno, strerror(errno));
// close(sockDst); if (bind(sockFrm, (struct sockaddr *)&fromAddr, sizeof(struct sockaddr_in)) != 0) {
// sockDst = -1; printf("Failed to bind %s:%d, errno=%d, %s\n", ip, port, errno, strerror(errno));
// return true; close(sockFrm);
// } sockFrm = -1;
return true;
}
return false; return false;
} }
void dst_close() void dst_close()
{ {
if (sockDst != -1) { if (sockFrm != -1) {
close(sockDst); close(sockFrm);
sockDst = -1; sockFrm = -1;
} }
return; return;
} }
@ -199,6 +203,10 @@ bool read_config(const char *cfgFile)
REPEATER.resize(6, ' '); REPEATER.resize(6, ' ');
printf("REPEATER=[%s]\n", REPEATER.c_str()); printf("REPEATER=[%s]\n", REPEATER.c_str());
if (! get_value(cfg, "gateway.ip", FROM_ADDRESS, 7, 15, "127.0.0.1"))
return true;
get_value(cfg, "gateway.internal.ip", FROM_PORT, 1000, 65535, 19000);
for (short int m=0; m<3; m++) { for (short int m=0; m<3; m++) {
std::string path = "module."; std::string path = "module.";
path += m + 'a'; path += m + 'a';
@ -271,12 +279,17 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
PORT = moduleport[module - 'A']; // set up the destination port
std::string IP_ADDRESS(moduleip[module - 'A']); int m = module - 'A';
if (0 == PORT) { if (0 >= moduleport[m]) {
printf("module %c has no port defined!\n", module); printf("module %c has no port defined!\n", module);
return 1; return 1;
} }
struct sockaddr_in toAddr;
memset(&toAddr, 0, sizeof(struct sockaddr_in));
toAddr.sin_family = AF_INET;
toAddr.sin_addr.s_addr = inet_addr(moduleip[m].c_str());
toAddr.sin_port = htons((unsigned short int)moduleport[m]);
if (strlen(argv[2]) > 8) { if (strlen(argv[2]) > 8) {
printf("MYCALL can not be more than 8 characters, %s is invalid\n", argv[2]); printf("MYCALL can not be more than 8 characters, %s is invalid\n", argv[2]);
@ -316,10 +329,10 @@ int main(int argc, char *argv[])
time(&tNow); time(&tNow);
CRandom Random; CRandom Random;
short int sport = (short int)PORT; unsigned short int uiport = (unsigned short int)FROM_PORT;
if (dst_open(IP_ADDRESS.c_str(), sport)) if (dst_open(FROM_ADDRESS.c_str(), uiport))
return 1; return 1;
printf("Opened %s:%u for writing\n", IP_ADDRESS.c_str(), sport); printf("Opened %s:%u for writing\n", FROM_ADDRESS.c_str(), uiport);
// Read and reformat and write packets // Read and reformat and write packets
while (true) { while (true) {
@ -341,11 +354,6 @@ int main(int argc, char *argv[])
/* read the packet */ /* read the packet */
nread = fread(dsvt.title, rlen, 1, fp); nread = fread(dsvt.title, rlen, 1, fp);
printf("Read %d byte packet from %s\n", (int)nread*rlen, argv[3]); printf("Read %d byte packet from %s\n", (int)nread*rlen, argv[3]);
if (rlen == 56)
printf("rpt1=%.8s rpt2=%.8s urcall=%.8s, mycall=%.8s, sfx=%.4s\n",
dsvt.hdr.rpt1, dsvt.hdr.rpt2, dsvt.hdr.urcall, dsvt.hdr.mycall, dsvt.hdr.sfx);
else
printf("streamid=%04X counter=%02X\n", dsvt.streamid, dsvt.counter);
if (nread == 1) { if (nread == 1) {
if (memcmp(dsvt.title, "DSVT", 4) != 0) { if (memcmp(dsvt.title, "DSVT", 4) != 0) {
printf("DVST title not found\n"); printf("DVST title not found\n");
@ -364,6 +372,7 @@ int main(int argc, char *argv[])
dstr.counter = htons(G2_COUNTER++); dstr.counter = htons(G2_COUNTER++);
if (rlen == 56) { if (rlen == 56) {
printf("r1=%.8s r2=%.8s ur=%.8s, my=%.8s/%.4s\n", dsvt.hdr.rpt1, dsvt.hdr.rpt2, dsvt.hdr.urcall, dsvt.hdr.mycall, dsvt.hdr.sfx);
memcpy(dstr.pkt_id, "DSTR", 4); memcpy(dstr.pkt_id, "DSTR", 4);
dstr.flag[0] = 0x73; dstr.flag[0] = 0x73;
dstr.flag[1] = 0x12; dstr.flag[1] = 0x12;
@ -440,13 +449,11 @@ int main(int argc, char *argv[])
} }
} }
int sent = sendto(sockDst, dstr.pkt_id, rlen + 2,0, (struct sockaddr *)&toDst, sizeof(toDst)); int sent = sendto(sockFrm, dstr.pkt_id, rlen + 2,0, (struct sockaddr *)&toAddr, sizeof(toAddr));
if (sent == 58) if (sent == 58)
printf("Sent DSTR HDR ur=%.8s r1=%.8s r2=%.8s my=%.8s/%.4s\n", printf("Sent DSTR HDR ur=%.8s r1=%.8s r2=%.8s my=%.8s/%.4s\n",
dstr.vpkt.hdr.ur, dstr.vpkt.hdr.r1, dstr.vpkt.hdr.r2, dstr.vpkt.hdr.my, dstr.vpkt.hdr.nm); dstr.vpkt.hdr.ur, dstr.vpkt.hdr.r1, dstr.vpkt.hdr.r2, dstr.vpkt.hdr.my, dstr.vpkt.hdr.nm);
else if (sent == 29) else if (sent != 29)
printf("Sent DSTR DATA streamid=%04X, ctrl=%02X\n", dstr.vpkt.streamid, dstr.vpkt.ctrl);
else
printf("ERROR: sendto returned %d!\n", sent); printf("ERROR: sendto returned %d!\n", sent);
} }
usleep(delay); usleep(delay);

Loading…
Cancel
Save

Powered by TurnKey Linux.