Ir para o conteúdo

Pesquisar na Comunidade

A mostrar resultados para tags ''sockets''.



Mais opções de pesquisa

  • Pesquisa por Tags

    Introduza as tags separadas por vírgulas.
  • Pesquisar por Autor

Tipo de Conteúdo


Fórum

  • Bem-vindos ao Portugal-a-Programar
    • Sugestões, Críticas ou Dúvidas relativas ao P@P
    • Acerca do P@P
    • Apresentações
  • Comunidade a Trabalhar
    • Wiki P@P
    • Apresentação de Projectos de Programação
    • Downloads
  • Revista PROGRAMAR
    • Revista PROGRAMAR
  • Desenvolvimento Geral
    • C
    • C++
    • Java
    • Haskell
    • Pascal
    • Python
    • Bases de Dados
    • Visual Basic Clássico
    • Visual Basic for Applications (VBA)
    • Dispositivos Móveis
    • Outras Linguagens
  • Desenvolvimento Orientado para Web
    • PHP
    • HTML
    • CSS
    • Javascript
    • Outras Linguagens de WebDevelopment
    • Desenvolvimento Web
  • Desenvolvimento .NET
    • C#
    • Visual Basic .NET
    • ASP.NET
    • WPF & SilverLight
  • Software e Sistemas Operativos
    • Software de Produtividade
    • Sistemas Operativos
    • SharePoint
    • Apresentação de Software
  • Informática Extra-Programação
    • Interfaces Visuais
    • Computação Gráfica
    • Algoritmia e Lógica
    • Segurança e Redes
    • Hardware
    • Electrónica
    • Automação Industrial
    • Dúvidas e Discussão de Programação
    • Notícias de Tecnologia
  • Outras Áreas
    • Matemática
    • Dúvidas Gerais
    • Discussão Geral
    • Eventos
    • Anúncios de Emprego
    • Tutoriais
    • Snippets / Armazém de Código
  • Arquivo Morto
    • Projectos Descontinuados
    • System Empires

Blogs

  • Blog dos Moderadores
  • Eventos
  • Notícias de Tecnologia
  • Blog do Staff
  • Revista PROGRAMAR
  • Projectos
  • Wiki

Categorias

  • Revista PROGRAMAR
  • Tutoriais
  • Textos Académicos
  • Exercícios Académicos
    • Exercícios c/ Solução
    • Exercícios s/ Solução
  • Bibliotecas e Aplicações
  • Outros



Filtrar por número de...

19 resultados

  1. Se eu tiver vários sockets abertos, usando threads, como faço para identificar cada socket para enviar mensagens através dele?
  2. Criar um socket para enviar mensagens entre 2 PCs

    Boas. Estou a tentar criar o software do lado do servidor para ouvir e enviar dados para outro PC. Estou a seguir um código que encontrei na net mas estou a obter um erro quando compilo que não sou capaz de corrigir porque não sei como o fazer. O código é este: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <netinet/in.h> #include <unistd.h> #define BUFFER 256 typedef struct sockaddr_in sockin; int main(int argc, char const **argv) { int sockfd, newsockfd, portno, clilen; char buffer[BUFFER]; sockin serv_addr, cli_addr; int n; if(argc < 2){ fprintf(stderr, "ERROR, no port provided\n"); exit(-1); } if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ perror("ERROR opening socket!"); exit(-1); } memset((char *)&serv_addr, 0, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if(bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){ perror("Error binding"); exit(-1); } listen(sockfd, 5); clilen = sizeof(cli_addr); if((newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, (socklen_t *)&clilen)) < 0){ //<-- alterado aqui perror("ERROR accepting connection"); exit(-1); } memset(buffer, 0, sizeof(buffer)); n = read(newsockfd, buffer, 255); if(n < 0){ perror("ERROR reading from socket"); exit(-3); } printf("Here is the message: %s\n", buffer); return 0; } O erro que obtenho a compilar é o seguinte: O código que estou a seguir está aqui.
  3. Boas ppl, Como eu tive alguma dificuldade em fazer este "pequeno" projecto que é uma base para a minha PAP (Projecto de Aptidão Profissional) do curso de Técnico de Electrónica, Automação e Computadores vou colocar um pequeno snippset para quem anda à procura de algo semelhante e não encontrou como fazer (tal como eu xP), por isso eu coloquei mãos à massa e fui tentando com alguns conhecimentos básicos/intermediários de JAVA network. Código do Arduino: #include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress serverIP(192,168,1,105); int serverPort = 8888; int led_port = 5; String readString; EthernetServer server(serverPort); void setup() { Serial.begin(9600); Ethernet.begin(mac, serverIP); server.begin(); Serial.print("Server online."); pinMode(led_port, OUTPUT); } void loop() { EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); if (readString.length() < 30) { readString.concat(c); } Serial.print("Command: "); Serial.println(readString); if (readString == "led1") { digitalWrite(led_port, HIGH); Serial.println("Led status: 1 (ON)"); resetString(); } if (readString == "led0") { digitalWrite(led_port, LOW); Serial.println("Led status: 0 (OFF)"); resetString(); } } } delay(1); client.stop(); } } void resetString() { readString = ""; } Programação em Java: (OBS.: Desculpem os publics, pensei no inicio separar em classes mas preferi assim xD) package com.example.newcasaautomatizada; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.*; import java.net.*; public class MainActivity extends Activity { public String ip = "192.168.1.105"; public int porta = 8888; public DataOutputStream toServer = null; public DataInputStream fromServer = null; public Socket socket = null; Boolean connected = false; Button btnConectar, btnLigarled, btnDesligarled; TextView textlog, fromArd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnConectar = (Button) findViewById(R.id.btn_conectar); btnLigarled = (Button) findViewById(R.id.btn_ligarled); btnDesligarled = (Button) findViewById(R.id.btn_desligarled); textlog = (TextView) findViewById(R.id.textlog); changeConnectionStatus(false); outputText("OK!"); btnConectar.setonclickListener(buttonConnectonclickListener); btnLigarled.setonclickListener(buttonLigarLed); btnDesligarled.setonclickListener(buttonDesligarLed); } //fim onCreate Button.onclickListener buttonDesligarLed = new Button.onclickListener() { public void onclick(View arg0) { sendToServer("led0"); }}; Button.onclickListener buttonLigarLed = new Button.onclickListener() { public void onclick(View arg0) { sendToServer("led1"); }}; Button.onclickListener buttonConnectonclickListener = new Button.onclickListener() { public void onclick(View arg0) { if (!connected) { try { socket = new Socket(ip, porta); // Ip do arduino/ethernet toServer = new DataOutputStream(socket.getOutputStream()); fromServer = new DataInputStream(socket.getInputStream()); outputText("Ligado ao Ethernet!"); changeConnectionStatus(true); } catch (UnknownHostException e) { outputText(e.getMessage()); changeConnectionStatus(false); } catch (IOException e) { outputText(e.getMessage()); changeConnectionStatus(false); } } else { outputText("Desligado do Ethernet!"); closeAll(); outputText("Desligado!"); changeConnectionStatus(false); } }}; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } //fim onCreateOptionsMenu public void changeConnectionStatus(Boolean isConnected) { this.connected = isConnected; btnLigarled.setEnabled(isConnected); btnDesligarled.setEnabled(isConnected); if (isConnected) { btnConectar.setText("Desligar"); } else { btnConectar.setText("Ligar"); } }//fim changeConnectionStatus public void outputText(String msg) { textlog.setText(msg); } //fim outputText public void sendToServer(String msg) { if (connected) { try { toServer.writeBytes(msg); toServer.flush(); } catch(IOException e) { outputText(e.getMessage()); } } } //fim sendToServer public void closeAll() { try { toServer.close(); fromServer.close(); socket.close(); } catch (IOException e) { outputText(e.getMessage()); } } // fim closeAll } XML do android: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:baselineAligned="false" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:scrollbars="vertical" tools:context=".MainActivity" > <Button android:id="@+id/btn_conectar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/btn_conectar" /> <Button android:id="@+id/btn_ligarled" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/btn_conectar" android:layout_alignRight="@+id/btn_conectar" android:layout_below="@+id/btn_conectar" android:text="@string/btn_ligarled" /> <Button android:id="@+id/btn_desligarled" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/btn_ligarled" android:layout_alignRight="@+id/btn_ligarled" android:layout_below="@+id/btn_ligarled" android:text="@string/btn_desligarled" /> <TextView android:id="@+id/textlog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/btn_desligarled" android:layout_below="@+id/btn_desligarled" android:layout_marginTop="21dp" android:text="@string/textlog" /> </RelativeLayout>
  4. Boas, Estou com duvidas a nível de como possa fazer a comunicação entre 2 servidores e inicialmente um cliente. A nível de tipo de protocolo de comunicação é por TCP. As questões são, quantos sockets serão precisos para fazer a comunicação? Havendo inicialmente 2 servidores e um cliente.. o cliente terá o seu socket, depois há um servidor que será tanto servidor como cliente, isto é, ira comunicar com o servidor B e com o cliente. Dito isto o servidor A terá um socket para comunicar com o cliente, um socket para o servidor B e um terceiro para comunicar entre os dois? E agora uma pergunta completamente disparatada... as portas dos dois servidores para se comunicarem têm que obrigatoriamente ser iguais sendo que a porta para comunicar com o cliente será diferente...? Agradeço desde já a atenção
  5. Download files

    Bom dia, Eu tenho uma aplicação web e nela criei uma servlet simples, só com uma função para fazer o dowload de um ficheiro e fazer o stream dos dados para o cliente através do output da resposta. O problema é o seguinte, quando eu tento executar esta servlet num browser desktop funciona bem sem erros, consigo fazer o download do ficheiro ou renderiza-lo no browser. Mas quando eu tento aceder à servlet por exemplo no browser de um tablet android devolve-me a seguinte exceção: java.net.SocketException: Connection reset by peer: socket write error java.net.SocketOutputStream.socketWrite(Native Method) java.net.SocketOutputStream.write(SocketOutputStream.java(Compiled Code)) com.ibm.ws.io.Stream.write(Stream.java(Compiled Code)) com.ibm.ws.io.WriteStream.flushMyBuf(WriteStream.java(Inlined Compiled Code)) com.ibm.ws.io.WriteStream.flush(WriteStream.java(Inlined Compiled Code)) com.ibm.ws.http.ResponseStream.flush(ResponseStream.java(Compiled Code)) com.ibm.ws.io.WriteStream.flush(WriteStream.java(Compiled Code)) com.ibm.ws.webcontainer.http.HttpConnection.flush(HttpConnection.java(Inlined Compiled Code)) com.ibm.ws.webcontainer.srp.SRPConnection.flush(SRPConnection.java(Compiled Code)) com.ibm.ws.webcontainer.srt.SRTOutputStream.flush(SRTOutputStream.java(Compiled Code)) com.ibm.ws.webcontainer.srt.BufferedServletOutputStream.flushBytes(BufferedServletOutputStream.java(Compiled Code)) com.ibm.ws.webcontainer.srt.BufferedServletOutputStream.write(BufferedServletOutputStream.java(Compiled Code)) java.io.BufferedOutputStream.write(BufferedOutputStream.java(Compiled Code)) mynet.presentation.servlets.TestesVD.sendFile(TestesVD.java:765) mynet.presentation.servlets.TestesVD.doGet(TestesVD.java:97) javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code)) javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code)) com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java(Compiled Code)) com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java(Compiled Code)) com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java(Compiled Code)) com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet.java(Inlined Compiled Code)) com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java(Compiled Code)) com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletReferenceState.java(Compiled Code)) com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceReference.java(Inlined Compiled Code)) com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java(Compiled Code)) com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java(Compiled Code)) com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java(Compiled Code)) com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java(Compiled Code)) com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java(Compiled Code)) com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java(Compiled Code)) com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java(Compiled Code)) com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java(Compiled Code)) com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java(Compiled Code)) com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java(Compiled Code)) com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java(Compiled Code)) com.ibm.ws.http.HttpConnection.run(HttpConnection.java(Compiled Code)) com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled Code)) Código para download do ficheiro: private void sendFile(String filePathName, HttpServletResponse response, boolean forceSave) { String disposition = forceSave ? "attachment" : "inline"; OutputStream out = null; BufferedInputStream fileInput=null; try{ File dataFile=new File(filePathName); if(!dataFile.exists( )){ filePathName = new String( filePathName.getBytes("ISO-8859-1"), "UTF-8"); dataFile = new File(filePathName); } fileInput=new BufferedInputStream(new FileInputStream(dataFile)); //long fileSize=dataFile.length(); Obtenção do tamanho do ficheiro if( fileInput != null ) { out = new BufferedOutputStream(response.getOutputStream()); String contentType = getServletConfig().getServletContext().getMimeType( filePathName ); if( contentType == null ){ contentType = "application/unknown"; } System.out.println("disposition: "+disposition+" contentType: "+contentType+" out: "+out); response.setHeader("Content-Disposition", disposition + "; filename=\"" + dataFile.getName() + "\""); response.setContentType(contentType); System.out.println("Vai escrever out: "+out); final byte data[] = new byte[1024]; int c; /*while(( c = fileInput.read() ) != -1){ //Escreve do buffer de entrada (fonte) para o buffer que vai conter o ficheiro (destino) System.out.println(c); out.write( c ); }*/ while ((c = fileInput.read(data, 0, 1024)) != -1) { System.out.println(c); out.write(data, 0, c); } } }catch (FileNotFoundException e) { e.printStackTrace(); System.err.println("Erro ao enviar ficheiro:"+filePathName+"." ); }catch (Exception e0) { e0.printStackTrace(); System.err.println("Erro ao enviar ficheiro:"+filePathName+". " + e0.getLocalizedMessage()); } if(fileInput != null){ try { fileInput.close(); System.out.println("fecha o input"); }catch( Exception e1 ) { System.out.println("Erro ao fechar o input"); MyNetLog.sendErro("-> ERROR:Ocorreu uma exepção ao fechar o objeto fonte "+e1.getLocalizedMessage()); } } if(out != null){ try { System.out.println("fecha o output"); out.close(); } catch( Exception e2 ) { System.out.println("Erro ao fechar o output"); e2.printStackTrace(); //MyNetLog.sendErro("-> ERROR:Ocorreu uma exepção ao fechar o objeto destino "+e2.getLocalizedMessage()); } } } Obrigado. Filipe Queirós
  6. [Dúvida] Socket?

    Olá pessoal, Gostaria de ler sobre socket, alguem me recomenda algum site ou apostila?
  7. Sockets Lazarus

    Boas, alguém me consegue explicar como usar Sockets no lazarus, é que estou a dar essa matéria na escola e não consigo arranjar maneira de usar os sockets no lazarus.
  8. Depois de massacrar o pessoal na secção de java com perguntas sobre sockets, decidi pegar no código que tinha escrito fazer uma pequena aplicação. Tinha pensado numa pequena aplicação tipo um chat, mas depois lembrei-me que havia esta ideia antiga de um cliente simples para sockets. Isto foi mais por brincadeira, eventualmente será útil numa ou noutra situação, mas há outras formas simples e criar sockets ad hoc. Com o netbeans, por uma aplicação a rolar é uma questão de minutos. Claro que não está polida como deve ser, mas está funcional. podem fazer download da aplicação aqui... do código fonte ou da aplicação cmpilada. http://www.hdd.pt/download/1330260010/src.zip.html http://www.hdd.pt/download/1198638064/dist.zip.html
  9. Comunicação serie/socket

    Boa tarde Estou a desenvolver um sensor que roda 360º e para mostrar os dados estou a comunicar com o pc via arduino (serialport) e depois mostro num site enviando os dados por sockets. Estou a utilizar a linguagem coffeescript (javascript simplificado) na parte do pc. O problema neste momento é que preciso tambem de enviar dados do site para o arduino, mas não estou a ter sucesso... Se alguém me puder ajudar agradecia Nuno Velho
  10. Retorno de Socket

    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 }
  11. Aceder classes de outro thread

    Bons dias, Eu estou a fazer uma aplicação do tipo cliente-servidor em que uma das funcionalidades é um chat. Utilizador1 envia mensagem para Servidor e este reencaminha para o respetivo Utilizador2. Codigo de criação dos threads. while (listening) { try { //eu inicio um thread para cada cliente que se ligue servidor new Cliente(serverSocket.accept()).start(); } catch(IOException A) { reportError(A.toString()); //reportError função minha } } Codigo do Cliente.java /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package sv; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; /** * * @author Cr4zYPT */ public class Cliente extends Thread { // The socket used for communication with the client private Socket socket = null; /** * Class Constructor * * @param socket The socket used for communication with the client */ public Cliente(Socket socket) { this.socket = socket; } /** * The method called when the Thread begins execution */ @Override public void run() { String str; try { // Get I/O ends of the Socket PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String inputLine; sv_protocol sv = new sv_protocol(); // Read, process and reply to requests from ONE client while ((inputLine = in.readLine()) != null) { // Process request str=sv.process_request(inputLine); // Reply out.println(str); // Break on END message if (inputLine.equals("END")) break; } // Close socket connection & exit on final message out.close(); in.close(); socket.close(); } catch (IOException e) { WindowSV.w.reportError(e.toString()); } } } Eu eventualmente vou ter muitos threads, cada thread associado a um cliente. Como é que posso aceder a classe cliente a partir de outro thread. Por exemplo...O servidor recebe mensagem do Utilizador1, como é que ele pode aceder ao thread do Utilizador2 para a enviar para ele? Obg,
  12. Download ficheiro

    Boa tarde, Estou a tentar criar um programa que faça download de um ficheiro que está no servidor. O problema é que esse programa terá que ser obrigatoriamente em C e terá que correr tanto em Windows como em Linux, e em arquitecturas ARM também. Alguém me consegue dar uma ajuda? Cumprimentos, skiller10
  13. Em delphi (não coloquei na área pascal porque não se limita só a esta linguagem, pode ser em outras), é possível especificar qual conexão utilizar em idHttp? Digamos que eu tenha Conexão Local 1 e Conexão Local 2. Há modo de fazer isto? Caso não tiver como, existe alguma outra função em outra linguagem que consiga? Obrigado
  14. Aplicação Cliente/Servidor

    Olá galera, estava tentando criar uma aplicação de um chat simples, onde tem um cliente e um servidor pra começar a aprender sobre sockets, que consegui, mais ela só aceita uma conexão. Gostaria de saber como faço para o servidor receber e enviar dados de mais de um cliente. Obrigado.
  15. [Resolvido] Ler informação do socket

    Boas, A minha dúvida é a seguinte: estou a tentar ler informação que está a ser enviada para a porta 30145 do meu servidor e para isso estou a criar uma função para ler a informação, tratar e enviar para o mysql. O que acontece é que até ao método accept() corre tudo bem, é criado o socket, fica à escuta, o cliente liga-se e partir deste momento se fizer um telnet à porta a partir de qualquer máquina é detectado no accept, mas o meu problema está depois a tentar ler a informação. Ou seja, qual é a melhor maneira de ler o que me é enviado para a porta? int socket_desc; int addrlen; bool stop = false; struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(30145); socket_desc=socket(AF_INET,SOCK_STREAM,0); if (socket_desc==-1) perror("erro a criar socket"); int value = bind(socket_desc,(struct sockaddr *)&address,sizeof(address)); if(value==0){ printf("true\n"); }else if(value<0){ printf("erro no bind\n"); } listen(socket_desc,3); while(stop!=true){ addrlen = sizeof(struct sockaddr_in); int new_socket = accept(socket_desc, (struct sockaddr *)&address, &addrlen); if (new_socket<0) perror("erro no accept\n"); printf("New socket is %d\n",new_socket); //até aqui corre tudo bem int ret; int tmpres; char buffer[1024]; memset(buffer, 0, sizeof (buffer)); ret = recv(new_socket, buffer, sizeof(buffer), 0); if (ret<0) perror("erro a ler no socket\n"); }
  16. [C#] Chat

    Tendo como missão dinamizar o cantinho do C#, deixo aqui uma pequena brincadeira desenvolvida nesta linguagem, um chat, que serve para mostrar como é fácil trabalhar com sockets e threads em C#. Este artigo pode ser levado mais a sério se pensarmos que este sistema pode ser usado na comunicação entre dois sistemas efectuando, por exemplo, trocas de mensagens. Antes de continuar tenho de referir que este artigo é baseado numa aplicação que não foi desenvolvida por mim, pelo que os créditos desta aplicação podem ser encontrados aqui. A aplicação serve apenas de base para mostrar como se trabalha com sockets e threads em C#. Antes de falar sobre sockets, comunicação TCP e afins, urge uma explicação teórica de como este tipo de aplicações, cliente-servidor, costuma funcionar. Normalmente existe um servidor que se encontra à escuta num determinado porto. Quando o servidor recebe um pedido de ligação de um cliente, o servidor lança uma thread que passará a efectuar a comunicação com esse cliente, ficando assim o servidor livre para responder a outras solicitações de outros clientes. No final da comunicação, tanto o cliente como a thread do lado do servidor terminam. Esta é apenas uma forma, talvez a mais comum, do modo de funcionamento deste tipo de sistemas. Neste caso, dado que este chat é muito simples e efectua apenas uma ligação ponto-a-ponto, não existe necessidade do servidor lançar uma thread a cada pedido que recebe. Dito isto, passemos ao chat propriamente dito. Devem acompanhar este artigo vendo o código fonte do chat, que pode ser obtido aqui. Descompactem o zip e abram o ficheiro <localização_unzip>\TcpDeviceSimulatoryListener\TcpDeviceSimulatoryListener.sln que possui ambas as aplicações o cliente e o servidor. Abram o Form1.cs do TcpDeviceSimulatoryListener, que será o servidor e vejam que esta janela possui apenas o botão de "Start Listener", que servirá para iniciar o listener, ou seja, o servidor que ficará à escuta. A acção deste botão não é muito interessante pois faz pouco mais do que lançar o Form2.cs. Abram o Form2.cs e, este sim com mais interesse, para ver como funciona o servidor. Inicialização Reparem no construtor: public Form2(String hostPort, Form1 form1) { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // dataReadyToSend = new AutoResetEvent(false); refToForm1 = form1; // Resolve the local host. IPHostEntry localHost = Dns.Resolve(Dns.GetHostName()); // Create a local end point for listening. IPEndPoint localEndPoint = new IPEndPoint(localHost.AddressList[0], 4001); // Instantiate the TCP Listener. tcpListener = new TcpListener(localEndPoint); tcpListener.Start(); tcp = tcpListener.AcceptTcpClient(); ethernetThreadStart = new ThreadStart(this.ThreadProcPollOnEthernet); pollDevicesEthernetThread = new Thread(ethernetThreadStart); pollDevicesEthernetThread.Name = "Listener's Receive Thread"; pollDevicesEthernetThread.ApartmentState = System.Threading.ApartmentState.MTA; pollDevicesEthernetThread.Start(); } O que este construtor faz é: 1. Resolver o localhost, ou seja, descobrir qual é o IP da máquina local que funcionará como servidor: IPHostEntry localHost = Dns.Resolve(Dns.GetHostName()); 2. Criar o end point onde o o servidor irá ficar à escuta, ou seja, definir o endereço e o porto que o servidor irá usar para escutar comunicações dos clientes: IPEndPoint localEndPoint = new IPEndPoint(localHost.AddressList[0], 4001); 3. Instanciar o listner TCP com o end point, ou seja, criar uma ligação TCP que passará a escutar no endereço e porto definidos anteriormente: tcpListener = new TcpListener(localEndPoint); // Cria o listner TCP no end point definido anteriormente tcpListener.Start(); // Inicia o listner tcp = tcpListener.AcceptTcpClient(); // Instância da ligação TCP do listner definido É de referir que o tcp é um cliente TCP, como é visível no código na secção de definição dos atributos da classe Form2, e é obtido através do listner usando TcpListener.AcceptTcpClient(). 4. De seguida efectua-se lança-se a o cliente TCP numa thread de forma a que a thread onde corre o processo principal não fique bloqueada. Se não se usasse esta thread, então a janela ficaria congelada pois estaria apenas a responder à comunicação TCP, lançando o TCP numa thread separada, o utilizador pode interagir com a janela da aplicação, para escrever as suas mensagens no chat, enquantorecebe as mensagens do outro utilizador em simultâneo. Para tal, delega-se no método ThreadProcPollOnEthernet a comunicação tcp que depois é usado na thread: ethernetThreadStart = new ThreadStart(this.ThreadProcPollOnEthernet); // Definir que o método ThreadProcPollOnEthernet é um delegate pollDevicesEthernetThread = new Thread(ethernetThreadStart); // Cria uma thread onde o método ThreadProcPollOnEthernet, delegado, será o "corpo" da thread pollDevicesEthernetThread.Name = "Listener's Receive Thread"; pollDevicesEthernetThread.ApartmentState = System.Threading.ApartmentState.MTA; pollDevicesEthernetThread.Start(); // Inicia a thread, ou seja, o método ThreadProcPollOnEthernet passa a correr num processo separado. Receber Mensagens 5. O método ThreadProcPollOnEthernet é definido da seguinte forma: private void ThreadProcPollOnEthernet() { for (; { Thread.Sleep(100); byte[] msg = new Byte[Constants.maxNoOfBytes]; byte count1 = 0x01; for (int i = 0; i < msg.Length; i++) { msg[i] = count1++; } try { if (formClosing == true) { return; } int readBytes = tcp.GetStream().Read(msg,0,msg.Length); if (readBytes == 8) { StringBuilder shutMessage = new StringBuilder(8); for (int count = 0; count < 8; count++) { char ch = (char)msg[count]; shutMessage = shutMessage.Append(ch); } string shut = "shutdown"; string receivedMessage = shutMessage.ToString(); if (receivedMessage.Equals(shut)) { MessageBox.Show(this,"Shutdown Request has arrived from the \nconnected party.\nYou cannot send message anymore.\nPlease close the window.","Shut Down Request",MessageBoxButtons.OK,MessageBoxIcon.Information); buttonSend.Enabled = false; return; } } StringBuilder str = new StringBuilder(Constants.maxNoOfBytes); for (int count = 0; count < readBytes ; count++) { char ch = (char)msg[count]; str = str.Append(ch); str = str.Append(" "); } textBox1.Text = str.ToString(); } catch (IOException) { return; } } } Descrito de forma simples, o que este método faz é, num ciclo infinito com intervalos de 100 milisegundos de espera: 5.1. Preparar um array de bytes com um tamanho máximo (o número máximo de caracteres que a mensagem pode ter): byte[] msg = new Byte[Constants.maxNoOfBytes]; byte count1 = 0x01; for (int i = 0; i < msg.Length; i++) { msg[i] = count1++; } 5.2. Receber a mensagem através do cliente tcp: int readBytes = tcp.GetStream().Read(msg,0,msg.Length); 5.3. Compor a mensagem através da conversão dos bytes para uma string de caracteres e mostrá-la na textBox1: StringBuilder str = new StringBuilder(Constants.maxNoOfBytes); for (int count = 0; count < readBytes ; count++) { char ch = (char)msg[count]; str = str.Append(ch); str = str.Append(" "); } textBox1.Text = str.ToString(); 5.2.1. É de referir que, no código original, existe uma verificação de mensagem antes do código mostrado acima que verifica se a mensagem enviado é a palavra "shutdown". Se a mensagem enviado é a palavra "shutdown", então inicia-se o processo de shutdown do chat, onde as ligações serão fechadas e não será possível enviar nem receber mais mensagens: int readBytes = tcp.GetStream().Read(msg,0,msg.Length); if (readBytes == 8) { StringBuilder shutMessage = new StringBuilder(8); for (int count = 0; count < 8; count++) { char ch = (char)msg[count]; shutMessage = shutMessage.Append(ch); } string shut = "shutdown"; string receivedMessage = shutMessage.ToString(); if (receivedMessage.Equals(shut)) { MessageBox.Show(this,"Shutdown Request has arrived from the \nconnected party.\nYou cannot send message anymore.\nPlease close the window.","Shut Down Request",MessageBoxButtons.OK,MessageBoxIcon.Information); buttonSend.Enabled = false; return; } } Enviar Mensagem 6. O envio de mensagens, que ocorre quando o utilizador pressiona o botão "Send", é tão simples quando a recepção, apenas se efectuam as operações por ordem inversa: private void buttonSend_Click(object sender, System.EventArgs e) { if (textBox2.Text.Length != 0) { char[] charArray = textBox2.Text.ToCharArray(0,textBox2.Text.Length); dataToSend = new byte[textBox2.Text.Length]; for (int charCount = 0; charCount < textBox2.Text.Length; charCount++) { dataToSend[charCount] = (byte)charArray[charCount]; } } else { dataToSend = new byte[]{(byte)'e',(byte)'m',(byte)'p',(byte)'t',(byte)'y'}; } tcp.GetStream().Write(dataToSend,0,dataToSend.Length); textBox2.Text = ""; } 6.1. Converter a mensagem a enviar, que está numa string de characteres, para um array de bytes: char[] charArray = textBox2.Text.ToCharArray(0,textBox2.Text.Length); dataToSend = new byte[textBox2.Text.Length]; for (int charCount = 0; charCount < textBox2.Text.Length; charCount++) { dataToSend[charCount] = (byte)charArray[charCount]; } 6.1. Enviar através do cliente tcp o array de bytes: tcp.GetStream().Write(dataToSend,0,dataToSend.Length); E isto termina a parte do servidor. Comunicação Cliente Quanto ao cliente, a primeira acção a fazer é efectuar uma ligação entre o cliente e o servidor, depois usa-se a mesma técnica explicada no servidor para enviar e receber as mensagens. O código abaixo efectua a comunicação entre o cliente e o servidor: private void buttonConnect_Click(object sender, System.EventArgs e) { textBoxIPAddress.Enabled = false; IPAddress address = IPAddress.Parse(ipAddress); tcp = new TcpClient((new IPEndPoint(Dns.Resolve(Dns.GetHostName()).AddressList[0],4002))); LingerOption lingerOption = new LingerOption(false, 1); tcp.LingerState = lingerOption; tcp.Connect(new IPEndPoint(Dns.Resolve(ipAddress).AddressList[0],4001)); buttonSend.Enabled = true; ((Button)sender).Enabled = false; receiveThread = new Thread(new ThreadStart(ThreadProcReceive)); receiveThread.Name = "Client's Receive Thread"; receiveThread.ApartmentState = ApartmentState.MTA; receiveThread.Start(); } 6.1. O primeiro passo é criar um endereço IP do servidor a partir da string que o utilizador especificou: IPAddress address = IPAddress.Parse(ipAddress); 6.2. De seguida cria-se uma ligação TCP: tcp = new TcpClient((new IPEndPoint(Dns.Resolve(Dns.GetHostName()).AddressList[0],4002))); LingerOption lingerOption = new LingerOption(false, 1); tcp.LingerState = lingerOption; O LingerState define o tempo de espera aquando do fecho da ligação. Nota: não me parece necessário criar o TcpClient usando um IPEndPoint. No entanto não verifiquei se é suficiente construir a instância do cliente TCP usando unicamente tcp = new TcpClient(); . 6.3. Efecuta-se a ligação ao servidor: tcp.Connect(new IPEndPoint(Dns.Resolve(ipAddress).AddressList[0],4001)); 6.4. Inicia-se a thread de espera de mensagem, usando o delegate ThreadProcReceive: receiveThread = new Thread(new ThreadStart(ThreadProcReceive)); receiveThread.Name = "Client's Receive Thread"; receiveThread.ApartmentState = ApartmentState.MTA; receiveThread.Start(); E pronto. Após compilar a solução, podem usar este chat em duas máquinas na mesma rede da seguinte forma: - Executar o servidor numa máquina. - Pressionar "Start Listener". - Executar o cliente noutra máquina. - Introduzir o IP do servidor e pressionar "Connect" - Escrever as mensagens na caixa de texto e pressionar "Send" Consultem a documentação para saberem mais e para exclarecer dúvidas. Caso não vejam as vossas dúvidas exclarecidas, coloquem-nas aqui. Espero que tenham gostado do artigo. [Artigo no Wiki]
  17. [Java] Sockets

    Boas Pessoal, Ando iniciado no Java, e à bocado deu-me na cabeça saber como funciona os sockets, pois queria enviar mensagens de um computador para outro em LAN (ou seja, na mesma rede). Meti as mãos na pesquisa e li em parte o artigo da SUN http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html Encontra-se a funcionar e consigo enviar mensagem do computador cliente para o Servidor! Código do Cliente (socketcliente.java) /** * @author Dkid * Baseado nos artigos * http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html * http://www.devarticles.com/c/a/Java/Socket-Programming-in-Java/ */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; // pacote de streams import java.net.*; // pacote de sockets class socketcliente extends JFrame implements ActionListener { JLabel text,clicked; JButton botao; JPanel painel; JTextField campotexto; Socket socket = null; PrintWriter saida = null; BufferedReader entrada = null; socketcliente() //iniciamos o constructor { text = new JLabel("Texto a enviar por socket:"); campotexto= new JTextField(30); botao = new JButton("Enviar!"); botao.addActionListener(this); painel = new JPanel(); painel.setLayout(new BorderLayout()); painel.setBackground(Color.white); getContentPane().add(painel); painel.add("North", text); painel.add("Center", campotexto); painel.add("South", botao); } @Override public void actionPerformed(ActionEvent event) { Object fonte = event.getSource(); if (fonte == botao) //Envia informacao pelo socket { String text = campotexto.getText(); saida.println(text); campotexto.setText(new String("")); //recebe do servidor try{ String linha = entrada.readLine(); System.out.println("Texto recebido: " + linha); } catch (IOException e) { System.out.println("Falha na leitura!"); System.exit(1); } } } public void EscutaSocket() //cria ligacao de socket { try { socket = new Socket("127.0.0.1", 85); //aqui decidimos qual o IP e a sua porta, neste caso 127.0.0.1:85 saida = new PrintWriter(socket.getOutputStream(), true); entrada = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch(UnknownHostException e) { System.out.println("Host desconhecido: localhost"); System.exit(1); } catch (IOException e) { System.out.println("Não Existe Entrada nem Saída de informação"); System.exit(1); } } public static void main (String[] args) { socketcliente frame = new socketcliente(); frame.setTitle("Cliente"); WindowListener ls = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame.addWindowListener(ls); frame.pack(); frame.setVisible(true); frame.EscutaSocket(); } } Código do Servidor (SocketServer.java) /** * @author Dkid * Baseado nos artigos * http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html * http://www.devarticles.com/c/a/Java/Socket-Programming-in-Java/ */ import java.awt.Color; import java.awt.BorderLayout; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; class SocketServer extends JFrame implements ActionListener { JButton botao; JLabel label = new JLabel("Texto Recebido:"); JPanel painel; JTextArea campotexto = new JTextArea(); ServerSocket servidor = null; Socket cliente = null; BufferedReader entrada = null; PrintWriter saida = null; String linha; SocketServer(){ //Constructor botao = new JButton("Receber!"); botao.addActionListener(this); painel = new JPanel(); painel.setLayout(new BorderLayout()); painel.setBackground(Color.white); getContentPane().add(painel); painel.add("North", label); painel.add("Center", campotexto); painel.add("South", botao); } public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if(source == botao){ campotexto.setText(linha); } } public void EscutaSocket(){ try{ servidor = new ServerSocket(85); //Definição da porta que vai ficar à escuta, neste caso : porta 85 } catch (IOException e) { System.out.println("Não é possivel escutar na porta 85"); System.exit(-1); } try{ cliente = servidor.accept(); } catch (IOException e) { System.out.println("Servidor não aceitou: 85"); // System.exit(-1); } try{ entrada = new BufferedReader(new InputStreamReader(cliente.getInputStream())); saida = new PrintWriter(cliente.getOutputStream(), true); } catch (IOException e) { System.out.println("Falha de permissão: 85"); System.exit(-1); } while(true){ try{ linha = entrada.readLine(); //Send data back to cliente saida.println(linha); } catch (IOException e) { System.out.println("Falha de Leitura!"); System.exit(-1); } } } protected void finalize(){ //Clean up try{ entrada.close(); saida.close(); servidor.close(); } catch (IOException e) { System.out.println("Não é possivel fechar!."); System.exit(-1); } } public static void main(String[] args){ SocketServer frame = new SocketServer(); frame.setTitle("Servidor"); WindowListener ls = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame.addWindowListener(ls); frame.pack(); frame.setVisible(true); frame.EscutaSocket(); } }
  18. Vou agora apresentar um exemplo de manipulação de Sockets para criar uma simples aplicação Cliente / Servidor... Podem criar qualquer servidor ou cliente sobre esta filosofia bastando enviar os comandos do Protocolo a usar tipo o IRC ou SMTP para email... podem fazer tudo... analisem o RFC´s respectivos ao protocolo que pretemdem implementar e mãos à obra... NOTA: pagina oficial dos RFC´s - Documentos que standarizam os protocolos Internet http://www.ietf.org/rfc.html ou forneçam logo o numero do RFCcomo exemplo uma extensão do SMTP http://www.ietf.org/rfc/rfc2034.txt?number=2034 http://www.ietf.org/rfc/rfcNNNN.txt onde NNNN é o numero do RFC pretendido Para criar uma solução Cliente / Servidor temosobviamenteque criar dois progrmas... o Servidor que fica à escuta de ligações e o Cliente que inicia a ligação. Criem um ficheiro cliente.py e introduzam o seguinte código: from socket import * HOST = '192.168.0.10' PORT = 8010 BUFSIZ = 1024 ADDR = (HOSTPORT) tcpCliSock = socket(AF_INETSOCK_STREAM) tcpCliSock.connect(ADDR) while 1: data = raw_input('>') if not data: break tcpCliSock.send(data) data = tcpCliSock.recv(BUFSIZ) if not data: break print "ligado a "ADDR" - dados - "data tcpCliSock.close() e criem outro ficheiro servidor.py e ponham este código: from socket import * HOST = 'localhost' PORT = 8010 BUFSIZ = 1024 ADDR = (HOSTPORT) tcpSerSock = socket(AF_INETSOCK_STREAM) tcpSerSock.bind(ADDR) tcpSerSock.listen(5) while 1: print "esperando ligacao" tcpCliSockaddr = tcpSerSock.accept() print "ligado a: "addr while 1: data = tcpCliSock.recv(BUFSIZ) if not data: break tcpCliSock.send("recebendo... > " + data) tcpCliSock.close() tcpSerSock.close() numa linha de comandos do DOS executem o servidor.py para este ficar à escuta de ligações... estou a usar o porto 8010 mas se tiverem um servidor já à escuta nesse porto mudem o porto para outro qualquerafim de evitar conflitos... c:\servidor.py noutra janela de DOS ou noutro PC iniciem o cliente.py no código do programa cliente alterem nesta linha o IP do servidor HOST = '192.168.0.10' c:\cliente.py ficam com um servidor e um cliente... depois de inicializado o cliente escrevam qualquer texto e o mesmo texto vai aparecer na consola do servidor... giro... é assim que funcionam as aplicações cliente servidor... com imaginação podem criar o vosso proprio protocolo... tipo... criem um comando com o nome OLHA e num servidor.py ponham código para caso ele receba o texto OLHA... fixe... o céu é o limite.. ou nãojá se falam em Universos Paralelos e finalmente entendi o conceito... lento mas foi... que é que virá agora? no exemplo o servidor quando recebe dados ele evia de novo para o cliente acrescentando "recebendo"... para criarem o vosso proprio protocolo substituam esse código por um código de interpretação de comandotipo "caso data=OLHA istocaso data=DESLIGA aquilo" etc.... a variavel data está preenchida com os dados recebidos... tcpCliSock.send("recebendo... > " + data)
  19. Socket em C

    Boas ppl! Será que alguem me pode arranjar tutoriais de socket em C ??
×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade