Churc Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 Opaentão, tava fazendo um esqueminha de enviar tipos Record atravésde Sockets TCP...seria assim, exemploTMyRecord = packed recordA: String;B: Integer;end;Pro envio eu tava fazendo o seguinte, exemplovarMyRecord: TMyRecord;MyStream: TMemoryStream;beginMyRecord.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));ouClientSocket1.Socket.SendStream(MyStream);Ok vamos supor que enviou, ai recebo como, porque pelo que vinão é recebido tudo o pacote e sim aos poucos, mas como é pequenoo pacote então acho que capaz que receba tudoBom, enfim eu ficar postando meus códigos errados não vai adiantar rsralguém sabe como enviar e receber Records através de Socket TCP sejacomo Stream ou qualquer outro método rs?Abraçao Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 27, 2006 Autor Denunciar Share Postado Novembro 27, 2006 Certo,mas qual seria a estrutura correta para envio e recebimento:criando um memory stream, armazenando os dados do recordno memory stream, e envia com SendBuf ou SendStream?e pra receber no serversocket, terei que fazer um loop recebendoos dados ou virá o pacote por completo sabe me informar?se puder me passar algum exemplo prático ou algum site que contenhatal tipo de informação eu agradeço HEAHuvaleu1!abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Novembro 27, 2006 Denunciar Share Postado Novembro 27, 2006 criando um memory stream, armazenando os dados do recordno 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 recebendoos 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 28, 2006 Autor Denunciar Share Postado Novembro 28, 2006 opavaleu 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 enviaimagens e sim apenas os pixels que está modificado na tela...chama-se RFB (Remote Frame Buffer), mas não acho nada naInternet, tenho o source do VNC mas nossa vai meses pra passaraquilo pra Delphi rsrentão pesquisando, pesquisando eu achei um jeito, mas peloque 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 eenvia pro servidor os pixels que está modificado nelas exemploTPixels = packed recordRGB: Dword;PosX: Integer;PosY: Integer;end;então a cada pixel modificado eu mandava uma streamonde RGB estava a cor do pixel no formato RGB e PosX, PosYarmazenava a posição do pixel referente a tela...o problema é que esse processo é muito lento, até scaneartodo o bitmap, mesmo jogando pra 256 cores(pixelformat := pf8bit)onde se compara 1 byte por pixel fica lentão, resumindo vira o VNCmais lento que você possa imaginar AHUEHAbom, que pena... queria ter um vnc proprio rsrpor imagens eu consigo fazer mas cada imagem sai no mínimo com25 a 30 kb usando JPEG a qualidade horrível e pra enviar em redeuma maravilha mas para enviar em internet até vai mais não do jeito que eu queria rsrvaleu caraabraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Novembro 28, 2006 Denunciar Share Postado Novembro 28, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 28, 2006 Autor Denunciar Share Postado Novembro 28, 2006 opa Thales,magina se intrometer, cada opinião é importante e muitobem vinda!eu também as vezes vejo tópícos e nem respondo porquejá estao respondendo mas isso é ignorância nossa...então, eu havia lido sobre isso, que não se pode passarobjetos, referências a classes, ou qualquer coisa que nãoseja estático...mas valeu porque fica anotado pra outras pessoas saberem...vo postar o código aqui depois pra também se alguém umdia tiver essa dúvida...valeu brotherabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Novembro 28, 2006 Autor Denunciar Share Postado Novembro 28, 2006 opaalguém tem alguma idéia de se fazer um vncsem ser por imagens, tipo o que o VNC faz realmente,o protocolo RFB (Remote Frame Buffer) mas pra falarverdade desse protocolo só sei o nome não sei nempor onde começar srsrou tiver afim de fazermos um projeto delphi vnccolocar no sourceforge, onde nada mais nada menosseria um VNC comum passado pra Delphi, com mais opçõese uma delas seria o fato de poder dar suporte remotopassando por firewall, routers, etc...O problema do VNC original, é que você só consegue acessá-lose o computador destino tiver conexão direta com a Internet,você não consegue acessar um computador em uma rede porexemploVocê ---------> Internet --------------> Destino = ConectaVocê ---------> Internet --------------> Roteador/Firewall -------------> Destino = Não conectaabraçao Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Idelson Pessoa Postado Dezembro 11, 2006 Denunciar Share Postado Dezembro 11, 2006 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Dezembro 12, 2006 Autor Denunciar Share Postado Dezembro 12, 2006 opaGrande Idelson Pessoa, valeu pelas informaçoes cara... vou dar uma olhada :Dabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Xcorpion Postado Julho 12, 2007 Denunciar Share Postado Julho 12, 2007 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!!!!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Julho 12, 2007 Autor Denunciar Share Postado Julho 12, 2007 OpaNada que se desculpar cara, o fórum é para isso e muito pelo contrário, antes você ressuscitarum tópico do que você criar um novo e as pessoas não verem nenhuma informação de ondecomeçar a te ajudar...Vou ver se acho aqui o esquema que fiz e supostamente adapto para você que havia dadocerto...abraçox Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Code Boy Postado Julho 12, 2007 Denunciar Share Postado Julho 12, 2007 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?Ateh +By. Code Boy Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Julho 13, 2007 Denunciar Share Postado Julho 13, 2007 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Code Boy Postado Julho 14, 2007 Denunciar Share Postado Julho 14, 2007 Opa obrigado pela dica amigo vou tentar aqui novamente Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Sspot Postado Agosto 12, 2008 Denunciar Share Postado Agosto 12, 2008 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Churc
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 para o comentário
Compartilhar em outros sites
15 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.