This is the CCS request receiver code. It was originally
authorOrion Lawlor <olawlor@acm.org>
Thu, 21 Sep 2000 22:48:01 +0000 (22:48 +0000)
committerOrion Lawlor <olawlor@acm.org>
Thu, 21 Sep 2000 22:48:01 +0000 (22:48 +0000)
duplicated in conv-host.c and conv-ccs.c/convcore.c (when
NODE_0_IS_CONVHOST).  Now it's all collected in one place.

This is the code that actually receives CCS requests from
clients on the network, and sends the responses back.
It is in charge of the CCS on-the-wire protocol format.

src/conv-ccs/ccs-server.c [new file with mode: 0644]
src/conv-ccs/ccs-server.h [new file with mode: 0644]
src/conv-core/ccs-server.c [new file with mode: 0644]
src/conv-core/ccs-server.h [new file with mode: 0644]

diff --git a/src/conv-ccs/ccs-server.c b/src/conv-ccs/ccs-server.c
new file mode 100644 (file)
index 0000000..75f3018
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+Converse Client/Server: Server-side interface
+Orion Sky Lawlor, 9/11/2000, olawlor@acm.org
+
+This file describes the under-the-hood implementation
+of the CCS Server.  Here's where Ccs requests from the
+network are actually received.
+*/
+#include <stdio.h>
+#include "conv-ccs.h"
+#include "ccs-server.h"
+
+#if CMK_CCS_AVAILABLE
+
+#define CCSDBG(x) printf x
+
+static SOCKET ccs_server_fd=SOCKET_ERROR;/*CCS request socket*/
+
+/*Make a new Ccs Server socket, on the given port.
+Returns the actual port and IP address.
+*/
+void CcsServer_new(int *ret_ip,int *use_port)
+{
+  unsigned int ip;
+  unsigned int port=0;if (use_port!=NULL) port=*use_port;
+  skt_init();
+  ip=skt_my_ip();
+  ccs_server_fd=skt_server(&port);
+  printf("ccs: %s\nccs: Server IP = %u, Server port = %u $\n", 
+           CMK_CCS_VERSION, ip, port);
+  fflush(stdout);
+  if (ret_ip!=NULL) *ret_ip=ip;
+  if (use_port!=NULL) *use_port=port;
+}
+
+/*Get the Ccs Server socket.  This socket can
+be added to the rdfs list for calling select().
+*/
+SOCKET CcsServer_fd(void) {return ccs_server_fd;}
+
+/*Connect to the Ccs Server socket, and 
+receive a ccs request from the network.
+Returns 1 if a request was successfully received.
+reqData is allocated with malloc(hdr->len).
+*/
+int CcsServer_recvRequest(CcsImplHeader *hdr,char **reqData) 
+{
+  CcsMessageHeader req;/*CCS header, from requestor*/
+  unsigned int ip,port;
+  int pe,reqBytes;
+  SOCKET fd;
+  CCSDBG(("CCS Receiving connection...\n"));
+  fd=skt_accept(ccs_server_fd,&ip,&port);
+  CCSDBG(("CCS   Connected to IP=%d, port=%d...\n",ip,port));
+  skt_recvN(fd,(char *)&req,sizeof(req));
+  pe=ChMessageInt(req.pe);
+  reqBytes=ChMessageInt(req.len);
+  CCSDBG(("CCS   Got %d-byte request for handler '%s'\n",reqBytes,req.handler));
+  
+  /*Fill out the internal CCS header*/
+  CcsImplHeader_new(req.handler,pe,ip,port,fd,reqBytes,hdr);
+
+  /*Grab the user data portion of the message*/
+  if (reqBytes<=0) *reqData=NULL;
+  else {
+    *reqData=(char *)malloc(reqBytes);
+    skt_recvN(fd,*reqData,reqBytes);
+  }
+  CCSDBG(("CCS   Got all %d data bytes for request.\n",reqBytes));
+  return 1;
+}
+
+/*Send a Ccs reply down the given socket.
+Closes the socket afterwards.
+*/
+void CcsServer_sendReply(SOCKET fd,int repBytes,const char *repData)
+{
+  if (repBytes>0)
+  {
+    ChMessageInt_t len=ChMessageInt_new(repBytes);
+       CCSDBG(("CCS   Sending %d bytes of reply data\n",repBytes));
+       skt_sendN(fd,(const char *)&len,sizeof(len));
+    skt_sendN(fd,repData,repBytes);
+  } else  
+       CCSDBG(("CCS   Reply empty.  Just closing socket.\n"));
+  skt_close(fd);
+  CCSDBG(("CCS Reply socket closed.\n"));
+}
+
+/*Build a new CcsImplHeader*/
+void CcsImplHeader_new(char *handler,
+                      int pe,int ip,int port,
+                      SOCKET replyFd,int userBytes,
+                      CcsImplHeader *imp)
+{
+  strncpy(imp->handler,handler,CCS_MAXHANDLER);
+  imp->pe=ChMessageInt_new(pe);
+  imp->ip=ChMessageInt_new(ip);
+  imp->port=ChMessageInt_new(port);
+  imp->replyFd=ChMessageInt_new(replyFd);
+  imp->len=ChMessageInt_new(userBytes);
+}
+
+#endif /*CMK_CCS_AVAILABLE*/
+
+
diff --git a/src/conv-ccs/ccs-server.h b/src/conv-ccs/ccs-server.h
new file mode 100644 (file)
index 0000000..a46ed87
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+Converse Client/Server: Server-side interface
+Orion Sky Lawlor, 9/13/2000, olawlor@acm.org
+
+CcsServer routines handle the CCS Server socket,
+translate CCS requests and replies into the final
+network format, and send/recv the actual requests
+and replies.
+
+Depending on the situation, this code is called from
+conv-host.c, or conv-core.c/conv-ccs.c (for 
+NODE_0_IS_CONVHOST).  All the routines in this file
+should be called from within only one machine&program-- 
+the CCS server.  That is, you can't receive a request
+on one machine, send the request to another machine,
+and send the response from the new machine (because
+the reply socket is for the original machine).
+*/
+
+#ifndef CCS_SERVER_H
+#define CCS_SERVER_H
+
+#include "sockRoutines.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if CMK_CCS_AVAILABLE
+
+/*Used within CCS implementation to identify requestor*/
+#define CCS_MAXHANDLER 32 /*Longest possible handler name*/
+typedef struct {
+  char handler[CCS_MAXHANDLER];/*Handler name for message to follow*/
+  ChMessageInt_t pe;/*Dest. processor # (global numbering)*/
+  ChMessageInt_t ip,port;/*Requestor's IP and port (for caller ID)*/
+  ChMessageInt_t replyFd;/*Send reply back here*/
+  ChMessageInt_t len;/*Bytes of message data to follow*/
+} CcsImplHeader;
+void CcsImplHeader_new(char *handler,
+                      int pe,int ip,int port,
+                      SOCKET replyFd,int userBytes,
+                      CcsImplHeader *imp);
+/********* CCS Implementation (not in ccs-server.c) ********/
+/*Deliver this request data to the appropriate PE. */
+void CcsImpl_netRequest(CcsImplHeader *hdr,const char *reqData);
+
+/*Deliver this reply data to this reply socket.
+  The data will have to be forwarded to CCS server.
+*/
+void CcsImpl_reply(SOCKET replFd,int repLen,const char *repData);
+
+/*Send any registered clients kill messages before we exit*/
+void CcsImpl_kill(void);
+
+void CcsInit(void);
+/*Convert CCS header & message data into a converse message to handler*/
+char *CcsImpl_ccs2converse(const CcsImplHeader *hdr,const char *data,int *ret_len);
+
+/******************* ccs-server.c routines ***************/
+/*Make a new Ccs Server socket, on the given port.
+Returns the actual port and IP address.
+*/
+void CcsServer_new(int *ret_ip,int *use_port);
+
+/*Get the Ccs Server socket.  This socket can
+be added to the rdfs list for calling select().
+*/
+SOCKET CcsServer_fd(void);
+
+/*Connect to the Ccs Server socket, and 
+receive a ccs request from the network.
+Returns 1 if a request was successfully received;
+0 otherwise.
+reqData is allocated with malloc(hdr->len).
+*/
+int CcsServer_recvRequest(CcsImplHeader *hdr,char **reqData);
+
+/*Send a Ccs reply down the given socket.
+Closes the socket afterwards.
+*/
+void CcsServer_sendReply(SOCKET fd,int repBytes,const char *repData);
+
+#else /*CCS not available*/
+
+#define CcsServer_new(i,p) /*empty*/
+#define CcsServer_fd() SOCKET_ERROR
+#define CcsServer_recvReq(h,b) 0
+#define CcsServer_sendReply(f,l,d) /*empty*/
+#define CcsImpl_kill() /*empty*/
+#define CcsInit() /*empty*/
+#endif /*CCS available*/
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/conv-core/ccs-server.c b/src/conv-core/ccs-server.c
new file mode 100644 (file)
index 0000000..75f3018
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+Converse Client/Server: Server-side interface
+Orion Sky Lawlor, 9/11/2000, olawlor@acm.org
+
+This file describes the under-the-hood implementation
+of the CCS Server.  Here's where Ccs requests from the
+network are actually received.
+*/
+#include <stdio.h>
+#include "conv-ccs.h"
+#include "ccs-server.h"
+
+#if CMK_CCS_AVAILABLE
+
+#define CCSDBG(x) printf x
+
+static SOCKET ccs_server_fd=SOCKET_ERROR;/*CCS request socket*/
+
+/*Make a new Ccs Server socket, on the given port.
+Returns the actual port and IP address.
+*/
+void CcsServer_new(int *ret_ip,int *use_port)
+{
+  unsigned int ip;
+  unsigned int port=0;if (use_port!=NULL) port=*use_port;
+  skt_init();
+  ip=skt_my_ip();
+  ccs_server_fd=skt_server(&port);
+  printf("ccs: %s\nccs: Server IP = %u, Server port = %u $\n", 
+           CMK_CCS_VERSION, ip, port);
+  fflush(stdout);
+  if (ret_ip!=NULL) *ret_ip=ip;
+  if (use_port!=NULL) *use_port=port;
+}
+
+/*Get the Ccs Server socket.  This socket can
+be added to the rdfs list for calling select().
+*/
+SOCKET CcsServer_fd(void) {return ccs_server_fd;}
+
+/*Connect to the Ccs Server socket, and 
+receive a ccs request from the network.
+Returns 1 if a request was successfully received.
+reqData is allocated with malloc(hdr->len).
+*/
+int CcsServer_recvRequest(CcsImplHeader *hdr,char **reqData) 
+{
+  CcsMessageHeader req;/*CCS header, from requestor*/
+  unsigned int ip,port;
+  int pe,reqBytes;
+  SOCKET fd;
+  CCSDBG(("CCS Receiving connection...\n"));
+  fd=skt_accept(ccs_server_fd,&ip,&port);
+  CCSDBG(("CCS   Connected to IP=%d, port=%d...\n",ip,port));
+  skt_recvN(fd,(char *)&req,sizeof(req));
+  pe=ChMessageInt(req.pe);
+  reqBytes=ChMessageInt(req.len);
+  CCSDBG(("CCS   Got %d-byte request for handler '%s'\n",reqBytes,req.handler));
+  
+  /*Fill out the internal CCS header*/
+  CcsImplHeader_new(req.handler,pe,ip,port,fd,reqBytes,hdr);
+
+  /*Grab the user data portion of the message*/
+  if (reqBytes<=0) *reqData=NULL;
+  else {
+    *reqData=(char *)malloc(reqBytes);
+    skt_recvN(fd,*reqData,reqBytes);
+  }
+  CCSDBG(("CCS   Got all %d data bytes for request.\n",reqBytes));
+  return 1;
+}
+
+/*Send a Ccs reply down the given socket.
+Closes the socket afterwards.
+*/
+void CcsServer_sendReply(SOCKET fd,int repBytes,const char *repData)
+{
+  if (repBytes>0)
+  {
+    ChMessageInt_t len=ChMessageInt_new(repBytes);
+       CCSDBG(("CCS   Sending %d bytes of reply data\n",repBytes));
+       skt_sendN(fd,(const char *)&len,sizeof(len));
+    skt_sendN(fd,repData,repBytes);
+  } else  
+       CCSDBG(("CCS   Reply empty.  Just closing socket.\n"));
+  skt_close(fd);
+  CCSDBG(("CCS Reply socket closed.\n"));
+}
+
+/*Build a new CcsImplHeader*/
+void CcsImplHeader_new(char *handler,
+                      int pe,int ip,int port,
+                      SOCKET replyFd,int userBytes,
+                      CcsImplHeader *imp)
+{
+  strncpy(imp->handler,handler,CCS_MAXHANDLER);
+  imp->pe=ChMessageInt_new(pe);
+  imp->ip=ChMessageInt_new(ip);
+  imp->port=ChMessageInt_new(port);
+  imp->replyFd=ChMessageInt_new(replyFd);
+  imp->len=ChMessageInt_new(userBytes);
+}
+
+#endif /*CMK_CCS_AVAILABLE*/
+
+
diff --git a/src/conv-core/ccs-server.h b/src/conv-core/ccs-server.h
new file mode 100644 (file)
index 0000000..a46ed87
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+Converse Client/Server: Server-side interface
+Orion Sky Lawlor, 9/13/2000, olawlor@acm.org
+
+CcsServer routines handle the CCS Server socket,
+translate CCS requests and replies into the final
+network format, and send/recv the actual requests
+and replies.
+
+Depending on the situation, this code is called from
+conv-host.c, or conv-core.c/conv-ccs.c (for 
+NODE_0_IS_CONVHOST).  All the routines in this file
+should be called from within only one machine&program-- 
+the CCS server.  That is, you can't receive a request
+on one machine, send the request to another machine,
+and send the response from the new machine (because
+the reply socket is for the original machine).
+*/
+
+#ifndef CCS_SERVER_H
+#define CCS_SERVER_H
+
+#include "sockRoutines.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if CMK_CCS_AVAILABLE
+
+/*Used within CCS implementation to identify requestor*/
+#define CCS_MAXHANDLER 32 /*Longest possible handler name*/
+typedef struct {
+  char handler[CCS_MAXHANDLER];/*Handler name for message to follow*/
+  ChMessageInt_t pe;/*Dest. processor # (global numbering)*/
+  ChMessageInt_t ip,port;/*Requestor's IP and port (for caller ID)*/
+  ChMessageInt_t replyFd;/*Send reply back here*/
+  ChMessageInt_t len;/*Bytes of message data to follow*/
+} CcsImplHeader;
+void CcsImplHeader_new(char *handler,
+                      int pe,int ip,int port,
+                      SOCKET replyFd,int userBytes,
+                      CcsImplHeader *imp);
+/********* CCS Implementation (not in ccs-server.c) ********/
+/*Deliver this request data to the appropriate PE. */
+void CcsImpl_netRequest(CcsImplHeader *hdr,const char *reqData);
+
+/*Deliver this reply data to this reply socket.
+  The data will have to be forwarded to CCS server.
+*/
+void CcsImpl_reply(SOCKET replFd,int repLen,const char *repData);
+
+/*Send any registered clients kill messages before we exit*/
+void CcsImpl_kill(void);
+
+void CcsInit(void);
+/*Convert CCS header & message data into a converse message to handler*/
+char *CcsImpl_ccs2converse(const CcsImplHeader *hdr,const char *data,int *ret_len);
+
+/******************* ccs-server.c routines ***************/
+/*Make a new Ccs Server socket, on the given port.
+Returns the actual port and IP address.
+*/
+void CcsServer_new(int *ret_ip,int *use_port);
+
+/*Get the Ccs Server socket.  This socket can
+be added to the rdfs list for calling select().
+*/
+SOCKET CcsServer_fd(void);
+
+/*Connect to the Ccs Server socket, and 
+receive a ccs request from the network.
+Returns 1 if a request was successfully received;
+0 otherwise.
+reqData is allocated with malloc(hdr->len).
+*/
+int CcsServer_recvRequest(CcsImplHeader *hdr,char **reqData);
+
+/*Send a Ccs reply down the given socket.
+Closes the socket afterwards.
+*/
+void CcsServer_sendReply(SOCKET fd,int repBytes,const char *repData);
+
+#else /*CCS not available*/
+
+#define CcsServer_new(i,p) /*empty*/
+#define CcsServer_fd() SOCKET_ERROR
+#define CcsServer_recvReq(h,b) 0
+#define CcsServer_sendReply(f,l,d) /*empty*/
+#define CcsImpl_kill() /*empty*/
+#define CcsInit() /*empty*/
+#endif /*CCS available*/
+
+#ifdef __cplusplus
+}
+#endif
+#endif