[BACK]Return to test1-tcp.c CVS log [TXT][DIR] Up to [local] / OpenXM / doc / oxlib

Annotation of OpenXM/doc/oxlib/test1-tcp.c, Revision 1.2

1.2     ! takayama    1: /* $OpenXM: OpenXM/doc/oxlib/test1-tcp.c,v 1.1 2000/09/07 21:34:06 takayama Exp $ */
1.1       takayama    2: /* A sample code to explain how to use ox_asir by TCP/IP and
                      3:    OpenXM control protocol.
                      4:    It computes the gcd of 12 and 8 by calling ox_asir server.
                      5:    */
                      6: #include <stdio.h>
                      7: #include <sys/types.h>
                      8: #include <sys/socket.h>
                      9: #include <sys/time.h>
                     10: #include <netinet/in.h>
                     11: #include <netdb.h>
                     12:
                     13: #define OX_COMMAND          513
                     14: #define OX_DATA             514
                     15: #define SM_executeFunction  269
                     16: #define SM_popString        263
                     17: #define CMO_STRING            4
                     18:
                     19: #define DATAPORT 4321
                     20: #define CONTROLPORT 1234
                     21:
                     22: static int Serial = 0;
                     23:
                     24: main() {
                     25:   int dataPort, controlPort;
                     26:   struct hostent *servhost;
                     27:   struct sockaddr_in cServer;
                     28:   struct sockaddr_in dServer;
                     29:   char s[1];
                     30:
                     31:   /* Starting the ox_asir server */
                     32:   system("xterm -geometry 80x25+0+0 -e ../../bin/ox -ox ../../bin/ox_asir -control 1234 -data 4321 &");
                     33:   sleep(3);
                     34:   if ((servhost = gethostbyname("localhost")) == NULL) {
                     35:     fprintf(stderr,"bad server name.\n"); exit(1);
                     36:   }
                     37:
                     38:   /* Connecting to the control port */
                     39:   bzero((char *)&cServer,sizeof(cServer));
                     40:   cServer.sin_family = AF_INET;
                     41:   cServer.sin_port = htons(CONTROLPORT);
                     42:   bcopy(servhost->h_addr,
                     43:         (char *)&cServer.sin_addr,servhost->h_length);
                     44:   if ((controlPort = socket(AF_INET,SOCK_STREAM,0)) <0) {
                     45:     fprintf(stderr,"socket allocation is failed.\n");
                     46:   }
                     47:   fprintf(stderr,"Trying to connect port %d  ",ntohs(cServer.sin_port));
                     48:
                     49:   if (connect(controlPort,(struct sockaddr *)&cServer,sizeof(cServer)) == -1) {
                     50:     fprintf(stderr,"cannot connect\n");
                     51:   }else{  fprintf(stderr,"Connected\n"); }
                     52:   sleep(1);
                     53:
                     54:   /* Connecting to the data port */
                     55:   bzero((char *)&dServer,sizeof(dServer));
                     56:   dServer.sin_family = AF_INET;
                     57:   dServer.sin_port = htons(DATAPORT);
                     58:   bcopy(servhost->h_addr,
                     59:         (char *)&dServer.sin_addr,servhost->h_length);
                     60:   if ((dataPort = socket(AF_INET,SOCK_STREAM,0)) <0) {
                     61:     fprintf(stderr,"socket allocation is failed.\n");
                     62:   }
                     63:   fprintf(stderr,"Trying to connect port %d  ",ntohs(dServer.sin_port));
                     64:
                     65:   if (connect(dataPort,(struct sockaddr *)&dServer,sizeof(dServer)) == -1) {
                     66:     fprintf(stderr,"cannot connect\n");
                     67:   }else{  fprintf(stderr,"Connected\n"); }
                     68:
                     69:   /* Byte order negotiation */
                     70:   read(controlPort,s,1);
                     71:   read(dataPort,s,1);
                     72:   s[0] = 0;
                     73:   write(controlPort,s,1);
                     74:   write(dataPort,s,1);
                     75:   fflush(NULL);
                     76:
                     77:   /* Computation by the engine */
                     78:   hoge(dataPort);
                     79:
                     80:   printf("\nType in ctrl-C to quit.\n");
                     81:   sleep(10000);
                     82: }
                     83:
                     84: ox_push_cmo(int dataPort,char *cmo,int length) {
                     85:   extern int Serial;
                     86:   char oxtag[4];
                     87:   char oxserial[4];
                     88:   *((int *)oxtag) = (int) htonl(OX_DATA);
                     89:   *((int *)oxserial) = (int) htonl(Serial++);
                     90:   write(dataPort,oxtag,4);
                     91:   write(dataPort,oxserial,4);
                     92:   write(dataPort,cmo,length);
                     93:   fflush(NULL);
                     94: }
                     95:
                     96: ox_push_cmd(int dataPort, int cmd) {
                     97:   extern int Serial;
                     98:   char oxtag[4];
                     99:   char oxserial[4];
                    100:   char oxcmd[4];
                    101:   *((int *)oxtag) = (int) htonl(OX_COMMAND);
                    102:   *((int *)oxserial) = (int) htonl(Serial++);
                    103:   *((int *)oxcmd) = (int) htonl(cmd);
                    104:   write(dataPort,oxtag,4);
                    105:   write(dataPort,oxserial,4);
                    106:   write(dataPort,oxcmd,4);
                    107:   fflush(NULL);
                    108: }
                    109:
                    110: ox_pop_int32(int dataPort) {
                    111:   char s[4];
                    112:   read(dataPort,s,4);
                    113:   return((int) ntohl( *((int *)s)));
                    114: }
                    115:
                    116: ox_pop_string(int dataPort,char *buf,int limit) {
                    117:   int oxtag, serial, cmotag, length ;
                    118:
                    119:   ox_push_cmd(dataPort,SM_popString);
                    120:   oxtag = ox_pop_int32(dataPort);  /* It must be CMO_DATA */
                    121:   serial = ox_pop_int32(dataPort); /* Read the serial number */
                    122:   cmotag = ox_pop_int32(dataPort); /* Read the CMO tag */
                    123:   if (cmotag != CMO_STRING) {
                    124:        fprintf(stderr,"The tag should be CMO_STRING.\n");
                    125:        exit(1);
                    126:   }
                    127:   length = ox_pop_int32(dataPort);
1.2     ! takayama  128:   if (length > limit-1) {
1.1       takayama  129:        fprintf(stderr,"Too long string to read.\n");
                    130:        exit(1);
                    131:   }
1.2     ! takayama  132:   read(dataPort,buf,length);
        !           133:   buf[length]=0;
1.1       takayama  134: }
                    135:
                    136: #define SIZE 1024
                    137: hoge(int dataPort) {
                    138:   char s[SIZE];
                    139:   /*  (CMO_ZZ,12); */
                    140:   unsigned char cmo0[]=
                    141:   {00, 00, 00, 0x14,
                    142:    00, 00, 00, 01, 00, 00, 00, 0xc};
                    143:
                    144:   /* (CMO_ZZ,8) */
                    145:   unsigned char cmo1[] =
                    146:   {00, 00, 00, 0x14,
                    147:    00, 00, 00, 01, 00, 00, 00, 8};
                    148:
                    149:   /* (CMO_INT32,2); */
                    150:   unsigned char cmo2[] =
                    151:   { 00, 00, 00, 02, 00, 00, 00, 02};
                    152:
                    153:   /* (CMO_STRING,"igcd") */
                    154:   unsigned char cmo3[] =
                    155:   {00, 00, 00, 04, 00, 00, 00, 04,
                    156:    0x69,0x67,0x63,0x64 };
                    157:
                    158:
                    159:   ox_push_cmo(dataPort,cmo0,12);
                    160:   ox_push_cmo(dataPort,cmo1,12);
                    161:   ox_push_cmo(dataPort,cmo2,8);
                    162:   ox_push_cmo(dataPort,cmo3,12);
                    163:
                    164:   ox_push_cmd(dataPort,SM_executeFunction);
                    165:   ox_pop_string(dataPort,s,SIZE);
                    166:
                    167:   printf("gcd of 12 and 8, in the string format, is \n");
                    168:   printf("%s",s);
                    169:   printf("\n");
                    170: }
                    171:
                    172:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>