From cb965611ce5881934349fc4e72a1f1263c4563a1 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 11 Jan 2016 20:59:07 -0500 Subject: [PATCH] rsrv: casr show multiple UDP clients --- src/ioc/rsrv/caservertask.c | 36 ++++++++++++++++++++++++++++++------ src/ioc/rsrv/cast_server.c | 6 ++++++ src/ioc/rsrv/server.h | 5 +++-- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/ioc/rsrv/caservertask.c b/src/ioc/rsrv/caservertask.c index 8b4ce4af4..f2dfd9165 100644 --- a/src/ioc/rsrv/caservertask.c +++ b/src/ioc/rsrv/caservertask.c @@ -266,6 +266,7 @@ int rsrv_init (void) clientQlock = epicsMutexMustCreate(); ellInit ( &clientQ ); + ellInit ( &clientQudp ); freeListInitPvt ( &rsrvClientFreeList, sizeof(struct client), 8 ); freeListInitPvt ( &rsrvChanFreeList, sizeof(struct channel_in_use), 512 ); freeListInitPvt ( &rsrvEventFreeList, sizeof(struct event_ext), 512 ); @@ -498,13 +499,36 @@ void casr (unsigned level) log_one_client(client, level); client = (struct client *) ellNext(&client->node); } - UNLOCK_CLIENTQ -/* - if (level>=2 && prsrv_cast_client) { - printf( "UDP Server:\n" ); - log_one_client(prsrv_cast_client, level); + + if (level>=2) { + client = (struct client *) ellNext ( &clientQudp.node ); + while (client) { + struct sockaddr_in addr; + osiSocklen_t alen = sizeof(addr); + char buf[40]; + + if (!getsockname(client->udpRecv, (struct sockaddr*)&addr, &alen)) { + ipAddrToDottedIP (&addr, buf, sizeof(buf)); + } else { + strcpy(buf, ""); + } + + printf( "UDP Name Server: recvfrom %s", buf ); + + alen = sizeof(addr); + if (!getsockname(client->sock, (struct sockaddr*)&addr, &alen)) { + ipAddrToDottedIP (&addr, buf, sizeof(buf)); + } else { + strcpy(buf, ""); + } + + printf( " sendto %s\n", buf ); + + client = (struct client *) ellNext(&client->node); + } } -*/ + UNLOCK_CLIENTQ + if (level>=2u) { bytes_reserved = 0u; bytes_reserved += sizeof (struct client) * diff --git a/src/ioc/rsrv/cast_server.c b/src/ioc/rsrv/cast_server.c index 6025ede0c..5467fa714 100644 --- a/src/ioc/rsrv/cast_server.c +++ b/src/ioc/rsrv/cast_server.c @@ -195,6 +195,12 @@ void cast_server(void *pParm) } epicsThreadSleep(300.0); } + client->udpRecv = recv_sock; + + assert(client->node.next==NULL && client->node.previous==NULL); + LOCK_CLIENTQ; + ellAdd ( &clientQudp, &client->node ); + UNLOCK_CLIENTQ; casAttachThreadToClient ( client ); diff --git a/src/ioc/rsrv/server.h b/src/ioc/rsrv/server.h index 7ed3f6ec8..c328195ed 100644 --- a/src/ioc/rsrv/server.h +++ b/src/ioc/rsrv/server.h @@ -88,7 +88,7 @@ typedef struct client { char *pUserName; char *pHostName; epicsEventId blockSem; /* used whenever the client blocks */ - SOCKET sock; + SOCKET sock, udpRecv; int proto; epicsThreadId tid; unsigned minor_version_number; @@ -166,7 +166,8 @@ enum ctl {ctlInit, ctlRun, ctlPause, ctlExit}; GLBLTYPE int CASDEBUG; GLBLTYPE SOCKET IOC_sock; GLBLTYPE unsigned short ca_server_port; -GLBLTYPE ELLLIST clientQ; /* locked by clientQlock */ +GLBLTYPE ELLLIST clientQ; /* (TCP clients) locked by clientQlock */ +GLBLTYPE ELLLIST clientQudp; /* locked by clientQlock */ GLBLTYPE ELLLIST beaconAddrList; GLBLTYPE ELLLIST casIntfAddrList; GLBLTYPE epicsMutexId clientQlock;