• Sábado 14 de Diciembre de 2024, 20:31

Autor Tema:  Comunicacion de Sockets Perl y C  (Leído 1871 veces)

skappermx

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Comunicacion de Sockets Perl y C
« en: Martes 7 de Octubre de 2008, 03:09 »
0
Hola tengo un problema quisiera comunicar un servidor que hice en C y un cliente en Perl :lol:  pero cada vez que conecto el cliente de perl me manda que la conexion ha sido rechazada  :(

Aqui les dejo el code de los dos:

C
Código: Text
  1.  /*
  2.     ** server.c -- Ejemplo de servidor de sockets de flujo
  3.     */
  4.  
  5.     #include <stdio.h>
  6.     #include <stdlib.h>
  7.     #include <unistd.h>
  8.     #include <errno.h>
  9.     #include <string.h>
  10.     #include <sys/types.h>
  11.     #include <sys/socket.h>
  12.     #include <netinet/in.h>
  13.     #include <arpa/inet.h>
  14.     #include <sys/wait.h>
  15.     #include <signal.h>
  16.  
  17.     #define MYPORT 3490    // Puerto al que conectarán los usuarios
  18.  
  19.     #define BACKLOG 10     // Cuántas conexiones pendientes se mantienen en cola
  20.  
  21.     void sigchld_handler(int s)
  22.     {
  23.         while(wait(NULL) > 0);
  24.     }
  25.  
  26.     int main(void)
  27.     {
  28.         int sockfd, new_fd;  // Escuchar sobre sock_fd, nuevas conexiones sobre new_fd
  29.         struct sockaddr_in my_addr;    // información sobre mi dirección
  30.         struct sockaddr_in their_addr; // información sobre la dirección del cliente
  31.         int sin_size;
  32.         struct sigaction sa;
  33.         int yes=1;
  34.  
  35.         if ((sockfd = socket(AF_INET, SOCK_STREAM, 6)) == -1) {
  36.             perror("socket");
  37.             exit(1);
  38.         }
  39.  
  40.         if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
  41.             perror("setsockopt");
  42.             exit(1);
  43.         }
  44.        
  45.         my_addr.sin_family = AF_INET;         // Ordenación de bytes de la máquina
  46.         my_addr.sin_port = htons(MYPORT);     // short, Ordenación de bytes de la red
  47.         my_addr.sin_addr.s_addr = INADDR_ANY; // Rellenar con mi dirección IP
  48.         memset(&(my_addr.sin_zero), '', 8); // Poner a cero el resto de la estructura
  49.  
  50.         if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
  51.                                                                        == -1) {
  52.             perror("bind");
  53.             exit(1);
  54.         }
  55.  
  56.         if (listen(sockfd, BACKLOG) == -1) {
  57.             perror("listen");
  58.             exit(1);
  59.         }
  60.  
  61.         sa.sa_handler = sigchld_handler; // Eliminar procesos muertos
  62.         sigemptyset(&sa.sa_mask);
  63.         sa.sa_flags = SA_RESTART;
  64.         if (sigaction(SIGCHLD, &sa, NULL) == -1) {
  65.             perror("sigaction");
  66.             exit(1);
  67.         }
  68.  
  69.         while(1) {  // main accept() loop
  70.             sin_size = sizeof(struct sockaddr_in);
  71.             if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,
  72.                                                            &sin_size)) == -1) {
  73.                 perror("accept");
  74.                 continue;
  75.             }
  76.             printf("server: got connection from %sn",
  77.                                                inet_ntoa(their_addr.sin_addr));
  78.             if (!fork()) { // Este es el proceso hijo
  79.                 close(sockfd); // El hijo no necesita este descriptor
  80.                 if (send(new_fd, "Hello, world!n", 14, 0) == -1)
  81.                     perror("send");
  82.                 close(new_fd);
  83.                 exit(0);
  84.             }
  85.             close(new_fd);  // El proceso padre no lo necesita
  86.         }
  87.  
  88.         return 0;
  89.     }
  90.  

y

PERL


Código: Text
  1.  
  2. #! /usr/bin/perl -w
  3. # client1.pl - a simple client
  4. use strict;
  5. use Socket;
  6. # initialize host and port
  7. my $host = shift || 'xxxxx';
  8. my $port = shift || 3460;
  9. my $proto = getprotobyname('tcp');
  10. # get the port address
  11. my $iaddr = inet_aton($host);
  12. my $paddr = sockaddr_in($port, $iaddr);
  13. # create the socket, connect to the port
  14. socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
  15.                         or die "socket: $!";
  16. connect(SOCKET, $paddr) or die "connect: $!";
  17. while (<SOCKET>) {
  18.         print;
  19. }
  20. close SOCKET or die "close: $!";
  21.  
  22.  


Gracias
« última modificación: Martes 7 de Octubre de 2008, 20:10 por skappermx »

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicacion de Sockets Perl y C
« Respuesta #1 en: Martes 7 de Octubre de 2008, 08:06 »
0
Usa el mismo puerto: 3490 != 3460.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

skappermx

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Comunicacion de Sockets Perl y C
« Respuesta #2 en: Martes 7 de Octubre de 2008, 20:10 »
0
:no:  :no:  :no:  :no:  esoty muy decepcionado de mi mismo, perdon no me habia dado cuenta

Gracias por el dato :hitcomp:  :hitcomp:  :hitcomp:  :hitcomp:  :hitcomp:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comunicacion de Sockets Perl y C
« Respuesta #3 en: Martes 7 de Octubre de 2008, 20:21 »
0
De nadas  :lol:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.