Jump to content
tiagogcunha

Retorno de Socket

Recommended Posts

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

}

Edited by thoga31
correcção GeSHi

Share this post


Link to post
Share on other sites
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!!!!

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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."

Share this post


Link to post
Share on other sites
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

Edited by tiagogcunha

Share this post


Link to post
Share on other sites
pikax

repara bem onde esta declarado a variavel socket!

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

Edited by 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."

Share this post


Link to post
Share on other sites
thoga31

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


Knowledge is free!

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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."

Share this post


Link to post
Share on other sites
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

Edited by tiagogcunha

Share this post


Link to post
Share on other sites
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."

Share this post


Link to post
Share on other sites
tiagogcunha

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

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

Edited by tiagogcunha

Share this post


Link to post
Share on other sites
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."

Share this post


Link to post
Share on other sites
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 =)

Edited by munkbozz

Share this post


Link to post
Share on other sites
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();
}

Edited by thoga31
correcção GeSHi

Share this post


Link to post
Share on other sites
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!

Edited by thoga31
Correcção GeSHi

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.