[C client]
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"
#include "unistd.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#ifdef UNIX
#define SOC_FILE            "/var/run/soc"
#endif
#define MAX_LEN           4000
#define TEXT_LEN          3730
int _get_byte4(unsigned char *a)
{
  return  a[0] | (a[1] << 8) | (a[2] << 16) | (a[3] << 24);
}
void write_answer(int soc, char typ, char *a)
{
  if (typ == 'G')
  {
    char dummy[3];
    dummy[0] = 'S';
    dummy[1] = 'O';
    dummy[2] = 'G';
    write(soc, dummy, 3);
    return;
  }
  if (typ == 'D')
  {
    char dummy[3];
    dummy[0] = 'S';
    dummy[1] = 'O';
    dummy[2] = 'D';
    write(soc, dummy, 3);
    return;
  }
  int n = strlen(a);
  unsigned char d[n+7]; //+8 if we uncomment d[i+7] = '\0';
  int rc;
  d[0] = 'S';  //(S)akura protocol
  d[1] = 'O';  //(O)racle database
  d[2] = typ;
  d[3] = n & 0xFF;
  d[4] = (n >> 8) & 0xFF;
  d[5] = (n >> 16) & 0xFF;
  d[6] = (n >> 24) & 0xFF;
  int i=0;
  while(a[i]){
    d[i+7] = a[i];
    i++;
  }
  //d[i+7] = '\0';
  rc = write(soc, d, i+7);
  if (rc<0)
  {
    perror("write answer failure");
    exit(EXIT_FAILURE);
  }
}
int main(void)
{
  int soc;
#ifdef UNIX
  struct sockaddr_un addr;
#else
  struct sockaddr_in addr;
#endif
  unsigned char packet_len[4];
  int rc;
  char header[3];
  char answer[MAX_LEN];
#ifdef UNIX
  soc = socket(AF_UNIX, SOCK_STREAM, 0);
  if(soc == -1) {
    perror("get socket failed");
    exit(EXIT_FAILURE);
  }
  memset(&addr, 0, sizeof(addr));
  addr.sun_family = AF_UNIX;
  strcpy(addr.sun_path, SOC_FILE);
#else
  soc = socket(AF_INET, SOCK_STREAM, 0);
  addr.sin_family = AF_INET;
  addr.sin_port = htons(2733);
#endif
  rc = connect(soc, (struct sockaddr *)&addr, sizeof(addr));
  if (rc == -1) {
    perror("client connect failed");
    exit(EXIT_FAILURE);
  }
  char s[100] = "pax/pax";
  int len;
//connect
  write_answer(soc, 'C', s);
  rc = read(soc, header, 3);
  if (rc == -1) {
    perror("client read header for connect failed");
    exit(EXIT_FAILURE);
  }
  rc = read(soc, packet_len, 4);
  if (rc == -1) {
    perror("client read packet_len for connect failed");
    exit(EXIT_FAILURE);
  }
  len = _get_byte4(packet_len);
  rc = read(soc, answer, len);
  if (rc == -1) {
    perror("client read packet_len for connect failed");
    exit(EXIT_FAILURE);
  }
  answer[len] = '\0';
//select
  //char sel[100] = "select f2 from t1 where f1=7";
  char sel[300] = "select n, praenomen, brevis, dsc, fd  from praenomen_masc where sysdate between fd and td and rownum<=2"; 
  write_answer(soc, 'S', sel);
  rc = read(soc, header, 3);
  if (rc == -1) {
    perror("client read header for select failed");
    exit(EXIT_FAILURE);
  }
  rc = read(soc, packet_len, 4);
  if (rc == -1) {
    perror("client read packet_len for select failed");
    exit(EXIT_FAILURE);
  }
  len = _get_byte4(packet_len);
  rc = read(soc, answer, len);
  if (rc == -1) {
    perror("client read packet_len for select failed");
    exit(EXIT_FAILURE);
  }
  answer[len] = '\0';
  printf("%s\n", answer);
//disconnect
  write_answer(soc, 'D', s);
  rc = read(soc, header, 3);
  if (rc == -1) {
    perror("client read header for disconnect failed");
    exit(EXIT_FAILURE);
  }
  rc = read(soc, packet_len, 4);
  if (rc == -1) {
    perror("client read packet_len for disconnect failed");
    exit(EXIT_FAILURE);
  }
  len = _get_byte4(packet_len);
  rc = read(soc, answer, len);
  if (rc == -1) {
    perror("client read packet_len for disconnect failed");
    exit(EXIT_FAILURE);
  }
//  printf("%s\n", answer);
/*
  write_answer(soc, 'G', s);
  rc = read(soc, header, 3);
  if (rc == -1) {
    perror("client read header for disconnect failed");
    exit(EXIT_FAILURE);
  }
  rc = read(soc, packet_len, 4);
  if (rc == -1) {
    perror("client read packet_len for disconnect failed");
    exit(EXIT_FAILURE);
  }
  len = _get_byte4(packet_len);
  rc = read(soc, answer, len);
  if (rc == -1) {
    perror("client read packet_len for connect failed");
    exit(EXIT_FAILURE);
  }
  answer[TEXT_LEN] = '\0';
  printf("%s\n", answer);
*/
  close(soc);
  exit(EXIT_SUCCESS);
}
sdmrnv, 2022-09-04 [0.39ms, s]
