Ir para conteúdo
Fórum Script Brasil
  • 0

Despertador Usando Sockets


Guest - Neo -

Pergunta

Fala pessoal, o negocio é o seguinte, to desenvolvendo aqui um serviço de desperador, que funciona da seguinte maneira. O Cliente se conecta com o Servidor, e digitará o comando:

SET e o intervalo de tempo (5seg), daí quando passar 5 segundos o servidor enviara para o cliente uma mensagem do tipo "acorde!!" será q deu pra entender + ou -, mas o foda é fazer isso com varios clientes.

alguém tem alguma ideia como posso fazer isso?

qualquer ajuda é bem vinda

sds Felipe

Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0

não conhecia, como ele funciona??

É bem simples e prático. Fiz um exemplo de como seria uma simples conexão entre dois computadores (ou, como no caso do exemplo, no mesmo computador, utilizando o endereço localhost).

Esse seria o arquivo servidor.py:

# -*- coding: iso-8859-1 -*-
import socket

s = socket.socket() #Criando um objeto da classe socket
s.bind(('localhost', 1984)) #Atribuindo a porta 1984 ao socket
s.listen(1)
print "Aguardando conexão na porta 1984..."
conexao, endereco = s.accept() #Aguardando conexão
print "Conectado a ", endereco
print "Enviando dados..."
conexao.send("um teste") #Envia a string "um teste"
print "... ok!"
conexao.close() #Fecha a conexão
print "Conexão finalizada!"
E esse seria o arquivo cliente.py:
# -*- coding: iso-8859-1 -*-
import socket

destino = ('localhost', 1984)
s = socket.socket()
print "Conectando com ", destino
try:
    s.connect(destino) #Tenta se conectar
except Exception, erro: #Caso ocorra algum erro
    print "Ocorreu o seguinte erro: %s" % erro
else: #Caso a conexão seja bem-sucedida
    print "Conectado!"
    print "Recebendo dados..."
    dados = s.recv(512) #Recebe até 512 bytes de uma vez
    print dados #Escreve os bytes (dados) recebidos
    print "... ok!"
    s.close() #Fecha a conexão
    print "Conexão finalizada!"
Para executar, basta chamar (no console):
python servidor.py
E após isso, chame em outro console:
python cliente.py

Isso supondo, é claro, que você já esteja na pasta onde os arquivos foram gravados e que você possua o interpretador Python na sua distro (ou que você o tenha instalado). Como eu disse, esse é um exemplo simples e somente realizará uma única conexão, enviará dados do servidor para o cliente, o cliente mostrará os dados na tela, e logo em seguida a conexão será finalizada. Obviamente que isso pode ser aperfeiçoado para o servidor aceitar vários clientes e ficar sendo executado o tempo todo, além de realizar ações mais complexas. Vale a pena dar uma olhada no tutorial da linguagem Python (no site tem) para compreender como funcionam suas estruturas básicas e seus tipos de dados. Daí, qualquer dúvida é só perguntar na sala de Python que existe aqui no fórum da ScriptBrasil.

você sabe de alguma boa apostila de sockets q possa me ensinar coisas para q eu consiga fazer esse sistema? valeu

Existem dois tutoriais que escrevi sobre sockets, focando a utilização de Winsock no Visual Basic. Todavia, os conceitos expostos lá são os mesmos que você utilizará para sockets em qualquer linguagem. Por isso, acho que vale a pena dar uma lida neles:

http://www.desenvolvedores.net/modules.php...=article&sid=27

http://www.desenvolvedores.net/modules.php...=article&sid=26

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

meu caro.....estava inspirado hoje...

de uma olhada nos códigos abaixo:

server.c

/* server.c */

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>

main()
{
   int cont,create_socket,new_socket,addrlen,tempo;
   int bufsize = 64;
   char *buffer = malloc(bufsize);
   struct sockaddr_in address;
   
   if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
     printf("Socket criado!!!\n");
   address.sin_family = AF_INET;
   address.sin_addr.s_addr = INADDR_ANY;
   address.sin_port = htons(15000);
   if (bind(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0)
     printf("Escutando...\n");
   listen(create_socket,3);
   addrlen = sizeof(struct sockaddr_in);
   new_socket = accept(create_socket,(struct sockaddr *)&address,&addrlen);
   if (new_socket > 0){
      printf("O cliente %s esta conectado...\n",inet_ntoa(address.sin_addr));
      for(cont=1;cont<5000;cont++)
	printf("\x7");
   }      
   recv(new_socket,buffer,bufsize,0);
   tempo=atoi(buffer);
   sleep(tempo);
   strcpy (buffer,"Acorde já se passaram os segundos desejados");
   send(new_socket,buffer,bufsize,0);
   close(new_socket);
   close(create_socket);
}
client.c
/* client.c */

#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>

main(int argc,char *argv[])
{
   int create_socket;
   int bufsize = 128;
   char *buffer = malloc(bufsize);
   struct sockaddr_in address;
   
   if (argc<=3)
   {
        printf ("use assim: ./%s ip_servidor SET x , onde x e o tempo em segundos!!!\n",argv[0]);
	exit (0);
   }
   else
        strcpy(buffer,argv[2]);
   if (strcmp(buffer,"SET")==0)
      strcpy(buffer,argv[3]);
   else
   {
      printf ("sua sintaxe contem erro!!!\n");
      exit (0);
   }
   if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
     printf("Socket criado!!!\n");
   address.sin_family = AF_INET;
   address.sin_port = htons(15000);
   inet_pton(AF_INET,argv[1],&address.sin_addr);
   
   if (connect(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0)
     printf("A conexao foi aceita com o servidor %s...\n",inet_ntoa(address.sin_addr));
   send(create_socket,buffer,bufsize,0);
   recv(create_socket,buffer,bufsize,0);
   printf ("%s\n",buffer);
   close(create_socket);
}

compile os códigos.....e execute primeiro o server depois o cliente...

não deu tempo de testar tudo....mas ele está se comportando bem!!!

para fazer conexões simultaneas, dê uma olhada na função fork

te+!!!!!!!!!!!!

Link para o comentário
Compartilhar em outros sites

  • 0

pior que eu não sei......tenta procurar no google!!

os scripts foram compilados no Linux pelo GCC

essas bibliotecas vem todas por padrão....

ta ai uma boa oportunidade de testar um LINUX!!!!!!!!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Opa!

Para usar sockets no windows é preciso usar a API WinSock. Você deve:

1. Incluir, no lugar de

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
isso:
#include <winsock2.h>
2. Faça a seguinte declaração:
WSAData info;
3. No início do código, logo depois da declaração das variáveis, coloque:
WSAStartup( MAKEWORD( 2, 0 ), &info );
Essa é a rotina de inicialização da API WinSock 2 (esse "MAKEWORD( 2, 0 )" indica a versão). Na variável "info" ficarão armazenadas informações sobre a biblioteca inicializada. 4. No final do código você deve adicionar a linha
WSACleanup();

para liberar os recursos alocados para essa API.

5. No menu do Dev, vá em Projeto->Opções de Projeto. Na aba "Parâmetros", clique em "Adicionar", vá ao diretório no qual está instalado o Dev, acesse a pasta "lib" e dê um duplo clique no arquivo "libws2_32.a". Clique em OK e pronto.

Até mais!

Link para o comentário
Compartilhar em outros sites

  • 0
Guest - Kandrade -

Fala Kandrade aí seus programa de certinho, eu adaptei ao meu aqui e ta funcionando legal, ele desperta de acordo com o tempo que eu ponho. Mas há um problema, to querendo criar uma fila de despertadores, ou seja, administrar despertadores, colocar pedidos em 1 fila encadeada, aí vamos dizer q 5 maquinas definam horarios pra despetarem:

maquina 01: 5seg

maquina02:10seg

maquina03:15seg e por aí vai

Esse exemplo aí abaixo foi dado pelo meu professor, mas não entendi muito bem, ele disse que com esse código aí em baixo ajudaria a fazer os despertadores.

#include<stdio.h>

#include<signal.h>

#include<sys/time.h>

#include<string.h>

#include<unistd.h>

void acao()

{

struct timeval horaAtual;

long hora;

gettimeofday(&horaAtual, NULL);

hora=horaAtual.tv_sec;

printf("Tempo atual e=%lu\n", hora);

}

int main()

{

struct sigaction action;

sigset_t set;

sigemptyset(&set);

sigaddset(&set,SIGALRM);

action.sa_handler=acao;

action.sa_mask=set;

action.sa_flags=SA_RESTART;

sigaction(SIGALRM,&action,NULL);

acao();

alarm(10);

pause();

fprintf(stderr,"Este é o restante do programa\n");

return 0;

}

Link para o comentário
Compartilhar em outros sites

  • 0
Opa!

Para usar sockets no windows é preciso usar a API WinSock. Você deve:

1. Incluir, no lugar de

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
isso:
#include <winsock2.h>
2. Faça a seguinte declaração:
WSAData info;
3. No início do código, logo depois da declaração das variáveis, coloque:
WSAStartup( MAKEWORD( 2, 0 ), &info );
Essa é a rotina de inicialização da API WinSock 2 (esse "MAKEWORD( 2, 0 )" indica a versão). Na variável "info" ficarão armazenadas informações sobre a biblioteca inicializada. 4. No final do código você deve adicionar a linha
WSACleanup();
para liberar os recursos alocados para essa API. 5. No menu do Dev, vá em Projeto->Opções de Projeto. Na aba "Parâmetros", clique em "Adicionar", vá ao diretório no qual está instalado o Dev, acesse a pasta "lib" e dê um duplo clique no arquivo "libws2_32.a". Clique em OK e pronto. Até mais!
Cara, não estava conseguindo criar o socket. Nenhum tutorial na net falava dessa linha
WSAStartup( MAKEWORD( 2, 0 ), &info );

Obrigado mesmo!!!!

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...