⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.c

📁 使用socket 通訊協定透過PROC存取 oracle database
💻 C
字号:
/* Result Sets Interface */#ifndef SQL_CRSR#  define SQL_CRSR  struct sql_cursor  {    unsigned int curocn;    void *ptr1;    void *ptr2;    unsigned int magic;  };  typedef struct sql_cursor sql_cursor;  typedef struct sql_cursor SQL_CURSOR;#endif /* SQL_CRSR *//* Thread Safety */typedef void * sql_context;typedef void * SQL_CONTEXT;/* Object support */struct sqltvn{  unsigned char *tvnvsn;   unsigned short tvnvsnl;   unsigned char *tvnnm;  unsigned short tvnnml;   unsigned char *tvnsnm;  unsigned short tvnsnml;};typedef struct sqltvn sqltvn;struct sqladts{  unsigned int adtvsn;   unsigned short adtmode;   unsigned short adtnum;    sqltvn adttvn[1];       };typedef struct sqladts sqladts;static struct sqladts sqladt = {  1,1,0,};/* Binding to PL/SQL Records */struct sqltdss{  unsigned int tdsvsn;   unsigned short tdsnum;   unsigned char *tdsval[1]; };typedef struct sqltdss sqltdss;static struct sqltdss sqltds ={  1,  0,};/* File name & Package Name */struct sqlcxp{  unsigned short fillen;           char  filnam[11];};static struct sqlcxp sqlfpn ={    10,    "server.cpp"};static unsigned int sqlctx = 80556;static struct sqlexd {   unsigned int   sqlvsn;   unsigned int   arrsiz;   unsigned int   iters;   unsigned int   offset;   unsigned short selerr;   unsigned short sqlety;   unsigned int   occurs;            short *cud;   unsigned char  *sqlest;            char  *stmt;   sqladts *sqladtp;   sqltdss *sqltdsp;            void  **sqphsv;   unsigned int   *sqphsl;            int   *sqphss;            void  **sqpind;            int   *sqpins;   unsigned int   *sqparm;   unsigned int   **sqparc;   unsigned short  *sqpadto;   unsigned short  *sqptdso;   unsigned int   sqlcmax;   unsigned int   sqlcmin;   unsigned int   sqlcincr;   unsigned int   sqlctimeout;   unsigned int   sqlcnowait;              int   sqfoff;   unsigned int   sqcmod;   unsigned int   sqfmod;            void  *sqhstv[4];   unsigned int   sqhstl[4];            int   sqhsts[4];            void  *sqindv[4];            int   sqinds[4];   unsigned int   sqharm[4];   unsigned int   *sqharc[4];   unsigned short  sqadto[4];   unsigned short  sqtdso[4];} sqlstm = {12,4};/* SQLLIB Prototypes */extern sqlcxt (/*_ void **, unsigned int *,                   struct sqlexd *, struct sqlcxp * _*/);extern sqlcx2t(/*_ void **, unsigned int *,                   struct sqlexd *, struct sqlcxp * _*/);extern sqlbuft(/*_ void **, char * _*/);extern sqlgs2t(/*_ void **, char * _*/);extern sqlorat(/*_ void **, unsigned int *, void * _*/);/* Forms Interface */static int IAPSUCC = 0;static int IAPFAIL = 1403;static int IAPFTL  = 535;extern void sqliem(/*_ char *, int * _*/);typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;typedef struct { unsigned short len; unsigned char arr[1]; } varchar;/* CUD (Compilation Unit Data) Array */static short sqlcud0[] ={12,4130,1,0,0,5,0,0,1,0,0,32,155,0,0,0,0,0,1,0,20,0,0,2,0,0,539,187,0,0,4,4,0,1,0,1,9,0,0,1,10,0,0,1,10,0,0,1,10,0,0,51,0,0,3,71,0,515,190,0,0,2,2,0,1,0,1,5,0,0,1,5,0,0,74,0,0,4,0,0,541,192,0,0,0,0,0,1,0,};/* server.c */#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <string.h>#include <stdlib.h>#include "sqlca.h"int port = 8000;void sql_error(char *);void insertdata(char []);int main(void){  struct sockaddr_in    sin;  struct sockaddr_in    pin;  int           mysock;  int           tempsock;  int           addrsize;  char  str[100],str1[20],str2[20],str3[100];  char  buf[100],buf1[100];  int           i, len1, len2;  float c;  /* 建立socket */  mysock = socket(AF_INET, SOCK_STREAM, 0);  if (mysock == -1) {    perror("call to socket");    exit(1);  }  /* 建立IPv4位址 */  bzero(&sin, sizeof(sin));  sin.sin_family = AF_INET;  sin.sin_addr.s_addr = htonl(INADDR_ANY);  sin.sin_port = htons(port);  /* ?結socket */  if (bind(mysock, (struct sockaddr *)&sin, sizeof(sin)) == -1) {    perror("call to bind");    exit(1);  }  /* 傾聽 client端 */  if (listen(mysock, 20) == -1) {    perror("call to listen");    exit(1);  }  printf("Accepting connections ...\n");  while(1) {    /* 接受client端連結 */    tempsock = accept(mysock, (struct sockaddr *)&pin, &addrsize);    if (tempsock == -1){      perror("call to accept");      exit(1);    }     /* 接收client端傳來的訊息 */    len1=recv(tempsock, str, 100, 0);    printf("\n收到字元數: %d\n",len1);    str[len1]=0;     // for (i=0;i<len1;i++){    printf("received from client : %s\n",str);    strcpy(str3,str);    insertdata(str3);    /* 分析處理client端傳來的訊息 */    if (len1 > 0) {      strcpy(str1,strtok(str," "));      printf("第 1 個字串為: %s\n",str1);                   strcpy(str2,strtok(NULL," "));      printf("第 2 個字串為: %s\n",str2);                   /*strcpy(str3,strtok(NULL," "));      printf("第 3 個字串為: %s\n",str3);      c=atof(str3)*1.05;*/      sprintf(buf1,"%s %s\n",str1,str2);    }    /* 將處理過的訊息傳回給client端 */    len2 = strlen(buf1);    if (send(tempsock, buf1, len2, 0) == -1) {      perror("call to send");      exit(1);    }    /* 關閉與client端的連線 */    close(tempsock);  }  return 0;}void sql_error(char *msg){  printf("\n%s %s\n", msg,(char *)sqlca.sqlerrm.sqlerrmc);  /* EXEC SQL ROLLBACK RELEASE; */ {  struct sqlexd sqlstm;  sqlstm.sqlvsn = 12;  sqlstm.arrsiz = 0;  sqlstm.sqladtp = &sqladt;  sqlstm.sqltdsp = &sqltds;  sqlstm.iters = (unsigned int  )1;  sqlstm.offset = (unsigned int  )5;  sqlstm.cud = sqlcud0;  sqlstm.sqlest = (unsigned char  *)&sqlca;  sqlstm.sqlety = (unsigned short)256;  sqlstm.occurs = (unsigned int  )0;  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);}  exit(0);}  void insertdata(char str[]) {/*   EXEC SQL INCLUDE sqlca; */ /* * $Header: sqlca.h 24-apr-2003.12:50:58 mkandarp Exp $ sqlca.h  *//* Copyright (c) 1985, 2003, Oracle Corporation.  All rights reserved.  */ /*NAME  SQLCA : SQL Communications Area.FUNCTION  Contains no code. Oracle fills in the SQLCA with status info  during the execution of a SQL stmt.NOTES  **************************************************************  ***                                                        ***  *** This file is SOSD.  Porters must change the data types ***  *** appropriately on their platform.  See notes/pcport.doc ***  *** for more information.                                  ***  ***                                                        ***  **************************************************************  If the symbol SQLCA_STORAGE_CLASS is defined, then the SQLCA  will be defined to have this storage class. For example:     #define SQLCA_STORAGE_CLASS extern   will define the SQLCA as an extern.   If the symbol SQLCA_INIT is defined, then the SQLCA will be  statically initialized. Although this is not necessary in order  to use the SQLCA, it is a good pgming practice not to have  unitialized variables. However, some C compilers/OS's don't  allow automatic variables to be init'd in this manner. Therefore,  if you are INCLUDE'ing the SQLCA in a place where it would be  an automatic AND your C compiler/OS doesn't allow this style  of initialization, then SQLCA_INIT should be left undefined --  all others can define SQLCA_INIT if they wish.  If the symbol SQLCA_NONE is defined, then the SQLCA variable will  not be defined at all.  The symbol SQLCA_NONE should not be defined  in source modules that have embedded SQL.  However, source modules  that have no embedded SQL, but need to manipulate a sqlca struct  passed in as a parameter, can set the SQLCA_NONE symbol to avoid  creation of an extraneous sqlca variable. MODIFIED    lvbcheng   07/31/98 -  long to int    jbasu      12/12/94 -  Bug 217878: note this is an SOSD file    losborne   08/11/92 -  No sqlca var if SQLCA_NONE macro set   Clare      12/06/84 - Ch SQLCA to not be an extern.  Clare      10/21/85 - Add initialization.  Bradbury   01/05/86 - Only initialize when SQLCA_INIT set  Clare      06/12/86 - Add SQLCA_STORAGE_CLASS option.*/ #ifndef SQLCA#define SQLCA 1 struct   sqlca         {         /* ub1 */ char    sqlcaid[8];         /* b4  */ int     sqlabc;         /* b4  */ int     sqlcode;         struct           {           /* ub2 */ unsigned short sqlerrml;           /* ub1 */ char           sqlerrmc[70];           } sqlerrm;         /* ub1 */ char    sqlerrp[8];         /* b4  */ int     sqlerrd[6];         /* ub1 */ char    sqlwarn[8];         /* ub1 */ char    sqlext[8];         };#ifndef SQLCA_NONE #ifdef   SQLCA_STORAGE_CLASSSQLCA_STORAGE_CLASS struct sqlca sqlca#else         struct sqlca sqlca#endif #ifdef  SQLCA_INIT         = {         {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '},         sizeof(struct sqlca),         0,         { 0, {0}},         {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '},         {0, 0, 0, 0, 0, 0},         {0, 0, 0, 0, 0, 0, 0, 0},         {0, 0, 0, 0, 0, 0, 0, 0}         }#endif         ;#endif #endif /* end SQLCA */  /* EXEC ORACLE OPTION (RELEASE_CURSOR = YES); */   /* EXEC SQL WHENEVER SQLERROR DO sql_error(" <ERROR> "); */     /* EXEC SQL BEGIN DECLARE SECTION; */   /* VARCHAR oraCN[30]; */ struct { unsigned short len; unsigned char arr[30]; } oraCN;  char e_id[6];  char e_name[11];    /* EXEC SQL VAR e_id IS STRING(6); */   /* EXEC SQL VAR e_name IS STRING(11); */     /* EXEC SQL END DECLARE SECTION; */     strcpy(e_id,strtok(str," "));  strcpy(e_name ,strtok(NULL," "));  printf("e_id:%s\n",e_id);  printf("e_name%s\n",e_name);  strcpy(oraCN.arr,"homn/homn@test");  oraCN.len = strlen(oraCN.arr);  oraCN.arr[oraCN.len]='\0';    /* EXEC SQL CONNECT :oraCN; */ {  struct sqlexd sqlstm;  sqlstm.sqlvsn = 12;  sqlstm.arrsiz = 4;  sqlstm.sqladtp = &sqladt;  sqlstm.sqltdsp = &sqltds;  sqlstm.iters = (unsigned int  )10;  sqlstm.offset = (unsigned int  )20;  sqlstm.cud = sqlcud0;  sqlstm.sqlest = (unsigned char  *)&sqlca;  sqlstm.sqlety = (unsigned short)256;  sqlstm.occurs = (unsigned int  )0;  sqlstm.sqhstv[0] = (         void  *)&oraCN;  sqlstm.sqhstl[0] = (unsigned int  )32;  sqlstm.sqhsts[0] = (         int  )32;  sqlstm.sqindv[0] = (         void  *)0;  sqlstm.sqinds[0] = (         int  )0;  sqlstm.sqharm[0] = (unsigned int  )0;  sqlstm.sqadto[0] = (unsigned short )0;  sqlstm.sqtdso[0] = (unsigned short )0;  sqlstm.sqphsv = sqlstm.sqhstv;  sqlstm.sqphsl = sqlstm.sqhstl;  sqlstm.sqphss = sqlstm.sqhsts;  sqlstm.sqpind = sqlstm.sqindv;  sqlstm.sqpins = sqlstm.sqinds;  sqlstm.sqparm = sqlstm.sqharm;  sqlstm.sqparc = sqlstm.sqharc;  sqlstm.sqpadto = sqlstm.sqadto;  sqlstm.sqptdso = sqlstm.sqtdso;  sqlstm.sqlcmax = (unsigned int )100;  sqlstm.sqlcmin = (unsigned int )2;  sqlstm.sqlcincr = (unsigned int )1;  sqlstm.sqlctimeout = (unsigned int )0;  sqlstm.sqlcnowait = (unsigned int )0;  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);  if (sqlca.sqlcode < 0) sql_error(" <ERROR> ");}  printf("\n [OK Connected!]\n ");  /* EXEC SQL INSERT INTO emp_mast(DEPT_NO,EMPLOY_NO,EMP_NAME) VALUES('AA',:e_id,:e_name); */ {  struct sqlexd sqlstm;  sqlstm.sqlvsn = 12;  sqlstm.arrsiz = 4;  sqlstm.sqladtp = &sqladt;  sqlstm.sqltdsp = &sqltds;  sqlstm.stmt = "insert into emp_mast (DEPT_NO,EMPLOY_NO,EMP_NAME) values ('\AA',:b0,:b1)";  sqlstm.iters = (unsigned int  )1;  sqlstm.offset = (unsigned int  )51;  sqlstm.cud = sqlcud0;  sqlstm.sqlest = (unsigned char  *)&sqlca;  sqlstm.sqlety = (unsigned short)256;  sqlstm.occurs = (unsigned int  )0;  sqlstm.sqhstv[0] = (         void  *)e_id;  sqlstm.sqhstl[0] = (unsigned int  )6;  sqlstm.sqhsts[0] = (         int  )0;  sqlstm.sqindv[0] = (         void  *)0;  sqlstm.sqinds[0] = (         int  )0;  sqlstm.sqharm[0] = (unsigned int  )0;  sqlstm.sqadto[0] = (unsigned short )0;  sqlstm.sqtdso[0] = (unsigned short )0;  sqlstm.sqhstv[1] = (         void  *)e_name;  sqlstm.sqhstl[1] = (unsigned int  )11;  sqlstm.sqhsts[1] = (         int  )0;  sqlstm.sqindv[1] = (         void  *)0;  sqlstm.sqinds[1] = (         int  )0;  sqlstm.sqharm[1] = (unsigned int  )0;  sqlstm.sqadto[1] = (unsigned short )0;  sqlstm.sqtdso[1] = (unsigned short )0;  sqlstm.sqphsv = sqlstm.sqhstv;  sqlstm.sqphsl = sqlstm.sqhstl;  sqlstm.sqphss = sqlstm.sqhsts;  sqlstm.sqpind = sqlstm.sqindv;  sqlstm.sqpins = sqlstm.sqinds;  sqlstm.sqparm = sqlstm.sqharm;  sqlstm.sqparc = sqlstm.sqharc;  sqlstm.sqpadto = sqlstm.sqadto;  sqlstm.sqptdso = sqlstm.sqtdso;  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);  if (sqlca.sqlcode < 0) sql_error(" <ERROR> ");}    /* EXEC SQL COMMIT; */ {  struct sqlexd sqlstm;  sqlstm.sqlvsn = 12;  sqlstm.arrsiz = 4;  sqlstm.sqladtp = &sqladt;  sqlstm.sqltdsp = &sqltds;  sqlstm.iters = (unsigned int  )1;  sqlstm.offset = (unsigned int  )74;  sqlstm.cud = sqlcud0;  sqlstm.sqlest = (unsigned char  *)&sqlca;  sqlstm.sqlety = (unsigned short)256;  sqlstm.occurs = (unsigned int  )0;  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);  if (sqlca.sqlcode < 0) sql_error(" <ERROR> ");}  printf("Insert 帳號:%s,名字:%s\n",e_id,e_name);  exit;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -