Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

tiagogcunha

Retorno de Socket

Mensagens Recomendadas

tiagogcunha    0
tiagogcunha

Boa Tarde,

Antes de mais gostaria de felicitar este projecto. Tenho uma dúvida de c++ que certamente será algo de bastante básico, mas visto que ainda me estou a iniciar nisto, tem sido um grande problema para mim.

Preciso de fazer um programa que envie mensagens de UDP, no entanto gostaria de chamar uma função para iniciar os sockets e todas as variáveis necessárias para enviar a mensagem e posteriormente uma outra para enviar efectivamente a mensagem. A razão pela qual necesito de fazer isto em funções separadas tem a ver com a natureza do restante código que requer o envio de mensagens UDP em determinados momentos para o socket UDP definido (uma única vez) no iníco.

Sei que a minha função "initUDP" deve retornar os dados necessários para poder usar a "sendUDP" mas não sei como nem que dados retornar para a poder utilizar.

Muito obrigado pela atenção,

Tiago Cunha


#include <iostream>
#include <string>
#include <sstream>
#include <random>
#include <thread>
#include <boost/asio.hpp>
#include <boost/array.hpp>

using namespace std;
using namespace boost::asio;
using ip::udp;

void initUDP(int port){

 io_service io1;  //Inicialização input-output
 udp::socket socket(io1,udp::endpoint(udp::v4(),port));  //criação de socket
 boost::array<char,1>recv;
 udp::endpoint client;
 boost::system::error_code err;
 socket.receive_from(buffer(recv),client,0,err);  

 if(err&&err!=error::message_size){
     std::cout<<"Error"<<std::endl;
     return;
    }

 boost::system::error_code ignored;
 return;
 }   //após executar esta função a conexão ao cliente UDP deverá estar estabelecida

void sendUDP(string message){

  socket.send_to(buffer(message),client,0,ignored);  //envia dados UDP para a conexão estabelecida
  return;
}

int main(int argc, char* argv[]){

  initUDP(atoi(argv[1]));       //Inicilaizar ligação
  sendUDP("Send This\n");  //enviar dados

}

Editado por thoga31
correcção GeSHi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tiagogcunha    0
tiagogcunha

Mais tarde irei também fazer para a situação de TCP, penso que será análogo a este caso. Investiguei e cheguei à conclusão que não é possivel retornar sockets, tentei variáveis globais mas sem sucesso. Não sei mesmo o que fazer...

Fico desde já MUITO agradecido pela ajuda, já que cheguei a um beco sem saída e não sei o que fazer mais.

OBRIGADO!!!!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

Mais tarde irei também fazer para a situação de TCP, penso que será análogo a este caso. Investiguei e cheguei à conclusão que não é possivel retornar sockets, tentei variáveis globais mas sem sucesso. Não sei mesmo o que fazer...

Fico desde já MUITO agradecido pela ajuda, já que cheguei a um beco sem saída e não sei o que fazer mais.

OBRIGADO!!!!

gostei muito do teu sentimento de que as pessoas são obrigadas a te responderem ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    159
pikax

podes sempre identar o codigo, sempre ajuda mais o pessoal a ler e compreender o codigo.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tiagogcunha    0
tiagogcunha

gostei muito do teu sentimento de que as pessoas são obrigadas a te responderem ...

O facto de o meu obrigado vir a Caps Lock é por mera cortesia e como forma de realçar o meu agradecimento pela eventual ajuda.

podes sempre identar o codigo, sempre ajuda mais o pessoal a ler e compreender o codigo.

Identar: DONE!

Gracias

Editado por tiagogcunha

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    159
pikax

repara bem onde esta declarado a variavel socket!

socket.send_to(buffer(message),client,0,ignored);

Editado por pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tiagogcunha    0
tiagogcunha

@tiagogcunha, em internetês, palavras em maiúsculas significam gritos, portanto não realça nada.

Peço desculpa, não foi com essa intenção! Certamente não era a minha intenção gritar com ninguém :)

repara bem onde esta declarado a variavel socket!

socket.send_to(buffer(message),client,0,ignored);

Sim, mas eu queria manter essa declaração, isto é: entra na função inicializar UDP, guarda o lugar para onde vai enviar, sai da função. Posteriormente envia dados de onde lhe apetecer, bastando para isso chamar a outra função: sendUDP.

Cumps.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    159
pikax

Sim, mas eu queria manter essa declaração, isto é: entra na função inicializar UDP, guarda o lugar para onde vai enviar, sai da função. Posteriormente envia dados de onde lhe apetecer, bastando para isso chamar a outra função: sendUDP.

Cumps.

repara bem onde esta declarado a variavel socket!

socket.send_to(buffer(message),client,0,ignored);


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tiagogcunha    0
tiagogcunha

repara bem onde esta declarado a variavel socket!

peço desculpa mas eu realmente não entendo como poderei alterar. Ela está declarada na initUDP e nesse ponto apenas a chamo... O que eu queria era "mandá-la" para a sendUDP. Eu realmente sou bastante leigo em C++, ainda estou na transição do C e há muita coisa que me escapa. Posso também estar a ter a estratégia errada para chegar à finalidade que quero...se por acaso houver sugestões são bem-vindas :)

obrigado

Editado por tiagogcunha

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    159
pikax

tens a variavel declarada na funcao Init e depois queres usar-la na send?


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tiagogcunha    0
tiagogcunha

tens a variavel declarada na funcao Init e depois queres usar-la na send?

Sim, é possível? qual o tipo desta variavel?

Editado por tiagogcunha

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    159
pikax

nao e' possivel fazer isso!!


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
munkbozz    7
munkbozz
udp::socket socket(io1,udp::endpoint(udp::v4(),port)); //criação de socket

Esta parte do código deve estar fora do procedimento (void initUDP), ai já a podes usar num escopo global.

Se dizes que estás em transição de C para C++, devias saber já como declarar este tipo de variáveis =)

Editado por munkbozz

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tiagogcunha    0
tiagogcunha

O meu projecto é ler informações recebidas de um Arduino pela porta serial e encaminha-las por UDP. A questão é que, com o código c++ que me foi dado para ler do arduino (assincrono), não consigo receber da função que lê a string lida deste para o main, de modo a conseguir utilizar o socket na função main. Sei que é um pouco confuso, mas basicamente é:

1) iniciar o bind do udp, etc

2) o arduino começa a vomitar valores

3) cada um deste deve ser enviado por UDP

O meu código de leitura do arduino é o seguinte:


#include <iostream>
#include <string>
#include <sstream>
#include <random>
#include <thread>
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

using namespace boost::system;
using namespace boost::asio;
using namespace std;
using ip::udp;

boost::asio::io_service io;
boost::asio::serial_port sp(io);
boost::asio::deadline_timer tim(io);
boost::asio::streambuf read_buf; //read buffer

int counter=0;
int i=0;
int j=0;

//Handlers for async callbacks
//declaration of write_handler to timer_handler
void write_handler(const error_code &ec, size_t nbytes);

void timer_handler(const error_code &ec){

 //timer expired - launch new write operation
 ostringstream os;
 os <<"Counter =" << ++counter;
 async_write(sp,buffer(os.str()),write_handler);
}

void write_handler(const error_code &ec, size_t nbytes){
 //writer done - program new deadline
 tim.expires_from_now(boost::posix_time::seconds(5));
 tim.async_wait(timer_handler);
}
void read_handler(const error_code &ec, size_t nbytes){
 //data is now available at read_buf
 cout << &read_buf;
}

async_read_until(sp,read_buf,'\n',read_handler);
}
//Main: error checking absent for simplicity
int main(){

 boost::system::error_code ec;
 sp.open("/dev/ttyACM0",ec); //connect to port
 sp.set_option(serial_port_base::baud_rate(9600),ec);

 //program timer for write operations
 tim.expires_from_now(boost::posix_time::seconds(5));
 tim.async_wait(timer_handler);

 //program chain of read operations
 async_read_until(sp,read_buf,'\n',read_handler);

 io.run();
}

Editado por thoga31
correcção GeSHi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tiagogcunha    0
tiagogcunha

E é nesta função que quero encaminhar por UDP a string &read_buf

void read_handler(const error_code &ec, size_t nbytes){
 //data is now available at read_buf
 cout << &read_buf;
}

Muito Obrigado!

Editado por thoga31
Correcção GeSHi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

acho engraçado estares a fazer uma aplicação em C++ e não criares uma única classe ...

ora diz lá:

- como fazer uma função disponibilizar informação ?

- como guardar essa informação ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tiagogcunha    0
tiagogcunha

acho engraçado estares a fazer uma aplicação em C++ e não criares uma única classe ...

ora diz lá:

- como fazer uma função disponibilizar informação ?

- como guardar essa informação ?

Suponho que com classes. Não criei porque (apesar de ler tutoriais) não sei bem como as ajustar à minha situação. Mas que tipo de classe/onde sugeres?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

Obrigado por tanta prestabilidade!

Em nome daqueles que têm vindo a disponibilizar de bom grado o seu tempo, obrigado por tanta consideração.

As pessoas tentam puxar pelo pensamento das outra pessoas para que dúvidas concretas surjam e outras sejam respondidas, e depois isto...


Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Flinger    50
Flinger

Tens várias possibilidades.

Uma, como já aqui referiram, é a utilização de variáveis globais. A tua variável socket é declarada fora das funções, e passa a estar acessível a qualquer função, desde que declarada num sítio onde consigam "ver" a variável.

Outra hipótese é passares a variável socket por referência para as várias funções que necessitam aceder à mesma. Não é uma forma tão confortável de manipular, mas muitas vezes previne erros inerentes ao uso de variáveis globais, e fomenta uma melhor organização do código.

Uma outra hipótese é o uso de classes, onde a variável passaria a ser uma variável de instância ou de classe. É uma solução mais elegante para c++, mas como sai fora da minha àrea de conforto, não posso opinar muito sobre ela.

Eu sei que por vezes é frustrante quando te respondem às dúvidas com mais perguntas, muitas das quais não te parecem fazer sentido, mas é o espírito do fórum puxar pelos seus utilizadores, tentando obrigá-los a aprender, em vez de entregar a papinha toda numa bandeja. É especialmente frustrante, para ambos os lados, quando as pessoas com dúvidas tentam dar passos maiores que as pernas, isto é, quando tentam fazer algo complexo sem demonstrarem ter os conhecimentos mais básicos. Mas se revelares esforço, iniciativa e vontade de aprender, consegues encontrar aqui ajuda para a maioria dos problemas.

Editado por Flinger

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

Uma outra hipótese é o uso de classes, onde a variável passaria a ser uma variável de instância ou de classe. É uma solução mais elegante para c++, mas como sai fora da minha àrea de conforto, não posso opinar muito sobre ela.

a solução de uso de classes necessita de ter em atenção que os dados a serem manipulados/geridos são recursos, logo não pode ser uma PO"C"O (para quem percebeu a referência ;) ).

implica que a classe siga um padrão de desenvolvimento que force a unicidade da classe como o design pattern : singleton. muito problemas podem advir se tal não for considerado (mesmo muitos)


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.