Jump to content
Fórum Script Brasil
  • 0

Record / Socket


Churc
 Share

Question

Opa

então, tava fazendo um esqueminha de enviar tipos Record através

de Sockets TCP...

seria assim, exemplo

TMyRecord = packed record

A: String;

B: Integer;

end;

Pro envio eu tava fazendo o seguinte, exemplo

var

MyRecord: TMyRecord;

MyStream: TMemoryStream;

begin

MyRecord.A := 'A :)';

MyRecord.B := 1;

MyStream := TMemoryStream.Create;

MyStream.WriteBuffer(MyRecord, SizeOf(MyRecord));

Agora vem o problema, envio como, Buff, Stream ?

ClientSocket1.Socket.SendBuf(MyStream, SizeOf(MyStream));

ou

ClientSocket1.Socket.SendStream(MyStream);

Ok vamos supor que enviou, ai recebo como, porque pelo que vi

não é recebido tudo o pacote e sim aos poucos, mas como é pequeno

o pacote então acho que capaz que receba tudo

Bom, enfim eu ficar postando meus códigos errados não vai adiantar rsr

alguém sabe como enviar e receber Records através de Socket TCP seja

como Stream ou qualquer outro método rs?

Abraçao

Link to comment
Share on other sites

15 answers to this question

Recommended Posts

  • 0

O SizeOf(MyRecord) retorna 8 bytes não importando o que tiver na String. Na verdade você está movendo o ponteiro da string(4 bytes) + o campo Integer(4 bytes).

O SizeOf(MyStream) retorna 4 bytes por ser um ponteiro.

O SendBuf de MyStream deveria ser MyStream.Memory^ porque não é o objeto que você vai mandar e sim o conteúdo armazenado na propriedade Memory dele.

Link to comment
Share on other sites

  • 0

Certo,

mas qual seria a estrutura correta para envio e recebimento:

criando um memory stream, armazenando os dados do record

no memory stream, e envia com SendBuf ou SendStream?

e pra receber no serversocket, terei que fazer um loop recebendo

os dados ou virá o pacote por completo sabe me informar?

se puder me passar algum exemplo prático ou algum site que contenha

tal tipo de informação eu agradeço HEAHu

valeu1!

abraço

Link to comment
Share on other sites

  • 0
criando um memory stream, armazenando os dados do record

no memory stream, e envia com SendBuf ou SendStream?

Acho que tanto faz, no meu caso utilizo SendBuf, colocando os dados num buffer linear e contínuo de memória.
e pra receber no serversocket, terei que fazer um loop recebendo

os dados ou virá o pacote por completo sabe me informar?

No recebimento você não possui o ReceiveStream, logo terá que receber pelo ReceiveBuf e esta função lhe retorna quantos bytes foram lidos. portanto é sempre bom fazer um loop de leitura até que todo o buffer seja lido.

Uma dica é você enviar na frente o tamanho do buffer que virá a seguir num campo Integer(4 Bytes).

Quando lê, você executa um ReceiveBuf com 4 e carrega o campo Inteiro.

Depois você entra no loop de leitura comparando a soma lida com esse campo.

Link to comment
Share on other sites

  • 0

opa

valeu s3c deu certo!!

pena que o que eu queria não deu certo...

eu ia fazer tipo um esquema igual do VNC, o VNC não envia

imagens e sim apenas os pixels que está modificado na tela...

chama-se RFB (Remote Frame Buffer), mas não acho nada na

Internet, tenho o source do VNC mas nossa vai meses pra passar

aquilo pra Delphi rsr

então pesquisando, pesquisando eu achei um jeito, mas pelo

que vi não é o mesmo que o vnc faz...

o jeito que achei é, gerar uma SS da tela, jogar as cores pra 256...

criar um processo que é conhecido como delta frame, onde a cada X

segundos você compara 2 SS, uma que é a SS anterior e uma nova e

envia pro servidor os pixels que está modificado nelas exemplo

TPixels = packed record

RGB: Dword;

PosX: Integer;

PosY: Integer;

end;

então a cada pixel modificado eu mandava uma stream

onde RGB estava a cor do pixel no formato RGB e PosX, PosY

armazenava a posição do pixel referente a tela...

o problema é que esse processo é muito lento, até scanear

todo o bitmap, mesmo jogando pra 256 cores(pixelformat := pf8bit)

onde se compara 1 byte por pixel fica lentão, resumindo vira o VNC

mais lento que você possa imaginar AHUEHA

bom, que pena... queria ter um vnc proprio rsr

por imagens eu consigo fazer mas cada imagem sai no mínimo com

25 a 30 kb usando JPEG a qualidade horrível e pra enviar em rede

uma maravilha mas para enviar em internet até vai mais não do jeito que eu queria rsr

valeu cara

abraços

Link to comment
Share on other sites

  • 0
mas qual seria a estrutura correta para envio e recebimento:

Desculpe me intrometer mas se quiser que o texto faça parte do registro e não só o ponteiro você tem que usar string com tamanho fixo tipo->

Rec = record
  st : string[16];
  i : integer;
end;
Nesse caso a string ocupará 17 bytes porque o elemento [0] vai ser o byte que indica o tamanho da string. Ou ->
Rec = record
  st : array[1..16] of char;
  i : integer;
end;
Nesse caso você vai poder fazer atribuições tipo rec.st:='abcdefghijklmnop'; e tem que ser string do mesmo tamanho porque senão da erro. Nesse caso a string ocupará somente 16 bytes. e se você quiser passar string de qualquer tamanho acho que é assim ->
var
  st : string;
begin
  st:='sarkfujhsdlkj sdkjfhasdl   akjlsdfh sfadk ';
  MyStream.WriteBuffer(pointer(st)^, length(st)+1);
  .
  .
  .

nesse caso o ultimo byte é o null terminator.

Link to comment
Share on other sites

  • 0

opa Thales,

magina se intrometer, cada opinião é importante e muito

bem vinda!

eu também as vezes vejo tópícos e nem respondo porque

já estao respondendo mas isso é ignorância nossa...

então, eu havia lido sobre isso, que não se pode passar

objetos, referências a classes, ou qualquer coisa que não

seja estático...

mas valeu porque fica anotado pra outras pessoas saberem...

vo postar o código aqui depois pra também se alguém um

dia tiver essa dúvida...

valeu brother

abraço

Link to comment
Share on other sites

  • 0

opa

alguém tem alguma idéia de se fazer um vnc

sem ser por imagens, tipo o que o VNC faz realmente,

o protocolo RFB (Remote Frame Buffer) mas pra falar

verdade desse protocolo só sei o nome não sei nem

por onde começar srsr

ou tiver afim de fazermos um projeto delphi vnc

colocar no sourceforge, onde nada mais nada menos

seria um VNC comum passado pra Delphi, com mais opções

e uma delas seria o fato de poder dar suporte remoto

passando por firewall, routers, etc...

O problema do VNC original, é que você só consegue acessá-lo

se o computador destino tiver conexão direta com a Internet,

você não consegue acessar um computador em uma rede por

exemplo

Você ---------> Internet --------------> Destino = Conecta

Você ---------> Internet --------------> Roteador/Firewall -------------> Destino = Não conecta

abraçao

Link to comment
Share on other sites

  • 0
Guest Idelson Pessoa

Não sei se isso que você quer com o VNC, eu utilizo o UltraVNC, lá no site deles tem o SC.

http://sc.uvnc.com/index.php?section=13 , e qualquer um pode fazer.

É só baixar os arquivos custom.zip ai descompacta o custom.zip em uma pasta e altere o BMP e coloque o logo seu ou o de sua empresa e altere o helpdesk.txt colocando seu ip (seu endereço de conexao de sua maquina) , depois de tudo ok, você compacta (zipa) os arquivos novamente em um custom.zip.

ai você volta no endereço acima e Click em Creator no painel esquerdo

login: foo

password: foobar

ai em Upload file: click em procurar e localize o zip que você fez e click em Enviar Consulta se tiver tudo correto o site do ULTRAVNC vai fazer um executavel "o tal programinha" e te mostrar na tela pra você fazer o dowload e passar para os seus clientes, eles vao utiliza-lo pra conectar em seu micro. mas antes você tera que instalar em seu micro o ULTRAVNC e depois de instalado você vai rodar o Run UltraVNC Viewer (Listen Mode) ai sim seu cliente pode executar o tal "programinha" pra conectar em sua maquina mas é você que tera o controle da maquina dele.

****** desse jeito você é que controla o micro, mas que conecta é o seu cliente à você. **********

Abraços,

IPSGYN

Link to comment
Share on other sites

  • 0

Olá pessoal, desculpa estar ressuscitando o tópico, mas é que to precisando de uma ajudinha. To querendo fazer o mesmo squema, enviar um record via socket, só que não tá dando certo, o programa roda e trava, não fazendo nada nem dando erro algum, se alguém poder me ajudar agraedço muito. A idéia principal do programa é um tipo messenger via socket na rede (TCP).

meu programa tá + ou - assim:

type msg =  packed record
                  texto: string;
                  nick: string;
                end;
var mensagem:msg;
e para enviar to fazendo o seguinte: (no botão de enviar mensagem) (cliente é ClientSocket e Servidor é ServerSocket, eu só mudei os nomes)
var MyStream: TMemoryStream;
begin
MyStream := TMemoryStream.Create;
mensagem.texto := txtmensagem.Text;
mensagem.nick := txtnick.Text;
MyStream.WriteBuffer(mensagem,sizeof(mensagem));
cliente.Socket.SendBuf(MyStream.Memory^, SizeOf(MyStream));
end;
e para receber: (no socket do servidor, ClientRead)
var i:integer;
      MsgRec : msgfrmt;

begin
Socket.ReceiveBuf(MsgRec,sizeof(MsgRec));
For i := 0 to Servidor.Socket.ActiveConnections-1 do
     Servidor.Socket.Connections[i].SendBuf(MsgRec,sizeof(MsgRec));
end;
e finalmente, quando o cliente recebe (Onread do clientsocket) faço o seguinte: (memo1 é um memo ou um componente RichText)
var msgtmp:string;
     msgrec:msgfrmt;

begin
  socket.ReceiveBuf(msgrec,sizeof(msgrec));
  msgtmp := '<' + msgrec.nick + '> ' + msgrec.texto;
  memo1.Lines.Add(msgtmp)
end;

Por favor quem puder me informar dos erros, agradeço!!!!!

Link to comment
Share on other sites

  • 0

Opa

Nada que se desculpar cara, o fórum é para isso e muito pelo contrário, antes você ressuscitar

um tópico do que você criar um novo e as pessoas não verem nenhuma informação de onde

começar a te ajudar...

Vou ver se acho aqui o esquema que fiz e supostamente adapto para você que havia dado

certo...

abraçox

Link to comment
Share on other sites

  • 0
aí galera aproveitem e tentem solucionar o meo problema do envio da imagem da webcam pra um aplicativo que manda pra outro via rede tendeo?

e quase isso que vocês estão colocando aí beleza?

então a dica pode ser: crie um "protocolo" em que você indica o nº da câmera e o frame (imagem) no formato JPG.

No processo de captura, em alguns componentes você pode ter um evento relacionado a captura do Frame (é uma implementação da callback CallbackOnFrame, que é chamada para cada frame capturado), o frame lá passado como parâmetro deverá ser convertido antes do envio.

Se você manjar inglês, dá uma espiada neste post na Expert Exchange.

Link to comment
Share on other sites

  • 0

OI gente!

estou fazendo uma rede de computadores a soft spot network que já opera em mais de 20 computadores, semelhante a internet.

Podem me ajudar por favor, é que eu uso sockets e não dão certo com roteador e eu perco clientes. (R$15,00 cada indo embora por usar roteador)

Me ajudem por favoooooor!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      151k
    • Total Posts
      649.1k
×
×
  • Create New...