Página 1 de 2
CLIPPER com TCP/IP.
Enviado: 02 Mai 2005 14:02
por MWAdriano
Pessoal,
Tenho um sistema em Clipper 5.3 que faz interface com máquinas de automação, e para ísso, utilizo comunicação via porta serial. Utilizo a biblioteca CA-TOOLS para as comunicações seriais.
Ocorre que esta mesma aplicação muitas vezes precisa se comunicar com softwares de terceiros, e estes muitas vezes utilizam banco de dados relacional.
Como não disponho de nenhuma ferramenta que se comunica com estes SGDB´s, decidi fazer uma aplicação em Java que se comunique com estes bancos relacionais através de JDBC. O fato é que agora, preciso estabelecer uma comunicação entre meu sistema em Clipper e minha ferramenta Java!
Para ísso, pensei em fazer a comunicação via protocolo de rede. O fato é que a CA-TOOLS dá suporte ao IPX/SPX, que posso utilizar. Mas gostaria, por motivos óbvios, de utilizar TCP/IP no lugar.
Alguém conhece alguma ferramenta para ísso?
Obrigado!
Enviado: 03 Mai 2005 10:40
por MWAdriano
Pessoal?
Enviado: 03 Mai 2005 10:51
por vagucs
Existem muitas ferramentas que disponibilizam o TCP/IP no DOS mas eu confesso que nunca consegui utilizar nenhuma, sempre alguma coisa dá errada.
Mas a solução para o seu problema se chama xHarbour, com ele vc tem acesso a bancos relacionais diretamente e acesso total ao TCP, porém seu aplicativo fica for Windows e só funcinará debaixo dele.
Você consegue o xHarbour em
www.xharbour.org
Enviado: 03 Mai 2005 10:58
por MWAdriano
Caros Amigos,
Eu consegui um código escrito em C na net, que diz ser a solução para o meu problema, porque implementa o TCP/IP dentro da aplicação Clipper.
Só existe um problema! Ela foi escrita para trabalhar com o linkeditor BLINKER, o que torna incompatível com meu sistema, porque ele tem que utilizar o Exospace, por falta de compatibilidade do Blinker com algumas funções da CA-TOOLS.
Alguém que manja de C, arriscaria uma conversão para uso com o EXOSPACE ?
obrigado...
Enviado: 03 Mai 2005 11:15
por MWAdriano
Se alguém quizer se aventurar e me ajudar, aqui vai...
Código: Selecionar todos
// TCPIP.C
// bcc -c -ml -w tcpip.c
// blinker ... search blxclp53 ...
#include <string.h>
#include <extend.api>
#include <blx286.h>
#define BUFF_SIZE 0x2000
#define PROTOCOL_TCP 6
#define NO_ERROR 0
#define ERR_SOCKET 100
#define ERR_NO_SOCKET 101
#define ERR_PARAMETERS 102
#define ERR_BLINKX_API 103
#define ERR_NO_TCP_STACK 104
#define ERR_POINTER 105
#define ERR_NO_POINTER 106
typedef struct
{
BYTE _dummy1[21], function, socket, error_code;
WORD port;
BYTE ip[4];
WORD _dummy2, length_of_packet, pointer;
BYTEP rm_buff;
WORD length_of_buffer;
BYTE _dummy3[120 /* ? */];
} RCB, *RCBP; // Request Control Block
extern FARP _xalloclow(WORD);
extern void _xfreelow(FARP);
extern FARP _bset(FARP, int, WORD);
HIDE REALPTR TCPIPstack_entry_point = NULL;
HIDE RCBP pm_rcb = NULL, rm_rcb;
HIDE BYTEP pm_buff, rm_buff;
HIDE BYTE socket = 0, error_code = NO_ERROR;
HIDE void near ndot2ip(BYTEP ip, BYTEP pdot)
{
int i, ch;
_bset(ip, 0, 4);
for(i = 0; i < 4; i++) do
{
if((ch = *pdot++) == '\0') return;
if(ch >= '0' && ch <= '9') ip[i] = ip[i] * 10 + ch - '0';
} while(ch != '.');
}
HIDE BOOL near rm_call(void)
{
REGS16 regs16;
pm_rcb->socket = socket;
pm_rcb->error_code = 0xff;
_bset((void*) regs16, 0, sizeof(REGS16));
regs16.es = SELECTOROF(rm_rcb);
regs16.si = OFFSETOF (rm_rcb);
if(DosRealFarCall(TCPIPstack_entry_point
, regs16, NULL, 0) != 0)
{error_code = ERR_BLINKX_API; return FALSE;}
return (error_code = pm_rcb->error_code) == 0;
HIDE BYTE near _TCP_open(void)
{
REGS16 regs16;
error_code = NO_ERROR;
if(socket != 0) return ERR_SOCKET;
if(PCOUNT < 2 || !ISCHAR(1) || !ISNUM(2)) return ERR_PARAMETERS;
regs16.ax = 0x7a40;
if(DosRealIntr(0x2f, regs16, NULL, 0) != 0) return ERR_BLINKX_API;
if((BYTE)regs16.ax != 0xff) return ERR_NO_TCP_STACK;
if((TCPIPstack_entry_point =
(REALPTR)MK_FP(regs16.es, regs16.di)) == NULL) return ERR_NO_POINTER;
if(pm_rcb != NULL) return ERR_POINTER;
if((pm_rcb = (RCBP)_xalloclow(sizeof(RCB) + BUFF_SIZE)) == NULL)
return ERR_NO_POINTER;
rm_rcb = (RCBP)DosProtToReal(pm_rcb);
pm_buff = (BYTEP)pm_rcb + sizeof(RCB);
rm_buff = (BYTEP)rm_rcb + sizeof(RCB);
_bset(pm_rcb, 0, sizeof(RCB));
pm_rcb->function = 0x11;
pm_rcb->port = PROTOCOL_TCP;
if(!rm_call()) return error_code;
if((socket = pm_rcb->socket) == 0) return ERR_NO_SOCKET;
_bset(pm_rcb, 0, sizeof(RCB));
pm_rcb->function = 4;
pm_rcb->port = ((WORD)_parni(2) >> 8) + (_parni(2) << 8);
ndot2ip(pm_rcb->ip, (BYTEP)_parc(1));
if(!rm_call()) return error_code;
return NO_ERROR;
}
HIDE void near _TCP_close(void)
{
if(socket == 0) return;
_bset(pm_rcb, 0, sizeof(RCB));
pm_rcb->function = 3;
rm_call();
socket = 0;
}
HIDE void near _TCP_free(void)
{
if(pm_rcb == NULL) return;
_xfreelow(pm_rcb);
pm_rcb = NULL;
}
CLIPPER TCP_open(void)
{
BYTE old_socket = socket, result;
RCBP old_pm_rcb = pm_rcb;
if((result = _TCP_open()) != NO_ERROR)
{
if(old_socket == 0 ) _TCP_close();
if(old_pm_rcb == NULL) _TCP_free();
}
_retni((int)(error_code = result));
}
CLIPPER TCP_read(void) // return: string + "\r\n"
{
if(socket == 0) {error_code = ERR_NO_SOCKET; _retc((BYTEP)""); return;}
_bset(pm_rcb, 0, sizeof(RCB));
pm_rcb->function = 0x12;
pm_rcb->length_of_packet = BUFF_SIZE;
pm_rcb->pointer = 1;
pm_rcb->rm_buff = rm_buff;
pm_rcb->length_of_buffer = BUFF_SIZE;
if(!rm_call()) pm_rcb->length_of_packet = 0;
pm_buff[pm_rcb->length_of_packet] = '\0';
_retc(pm_buff);
}
CLIPPER TCP_write(void)
{
if(socket == 0) {error_code = ERR_NO_SOCKET; return;}
if(PCOUNT < 1 || !ISCHAR(1)) {error_code = ERR_PARAMETERS; return;}
strcpy((char*)pm_buff, _parc(1));
_bset(pm_rcb, 0, sizeof(RCB));
pm_rcb->function = 0x14;
pm_rcb->length_of_packet = BUFF_SIZE;
pm_rcb->pointer = 1;
pm_rcb->rm_buff = rm_buff;
pm_rcb->length_of_buffer = strlen((char*)pm_buff);
rm_call();
}
CLIPPER TCP_close(void)
{
if(socket == 0) {error_code = ERR_NO_SOCKET; return;}
_TCP_close();
_TCP_free();
}
CLIPPER TCP_error(void)
{
_retni((int)error_code);
}
Enviado: 03 Mai 2005 11:48
por vagucs
Perfeitom procurei isto por anos, onde conseguiu, funciona debaixo do Windows ou precisa de um packet drive instalado?
Enviado: 03 Mai 2005 11:53
por Dudu_XBase
Enviado: 03 Mai 2005 12:12
por MWAdriano
Sei lá Wagner. Ainda estou tentando compilar...
Enviado: 03 Mai 2005 18:02
por vagucs
Lá pelo dia 10 estarei em casa novamente, tenho o BCC lá para DOS ai vou compilar e ver se realmente funciona, ai vou postar no meu site a rotina compilado e modo de usar.
Enviado: 04 Mai 2005 20:18
por MWAdriano
Então fico no aguardo.
Até lá, se alguém se interessar em compilar esta ferramenta e testar,...
Será uma mão na roda. Mas tá difíciu compilar essa coisa, porque tá dando uns paus.. Acho que é porque eu não manjo muito de C..
Enviado: 11 Mai 2005 12:47
por TerraSoftware
E ai pessoal... alguma novidade sobre este assunto?
Estou muito interessado !!!
Qualquer novidade nos avise.
Se eu puder ajudar de alguma forma estou a disposição !!!
Enviado: 11 Mai 2005 14:59
por vagucs
ainda to em SP, sexta vou estar em casa e vou aproveitar o final de semana para ver isto.
Enviado: 16 Mai 2005 19:23
por MWAdriano

?
Enviado: 17 Mai 2005 01:34
por rochinha
Hei Vagner
Que se ta fazendo aqui em Sampa, aqui só tem pancadaria em estadio e muito trombadinha, vai pra casa logo.
É mais interessante falar contigo quando ce tá queimando bits e neuronios no seu QG.
@braços :?)
Não esqueça de visitar o Pico do Jaraguá.
Enviado: 17 Mai 2005 17:08
por vagucs
Tô em casa, amanha cedo terei tempo de olhar isto, ai vou postar um topico novo com os arquivos e tudo mais.
Falow