Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema gordo con la funcion socket()

Estas en el tema de Problema gordo con la funcion socket() en el foro de C/C++ en Foros del Web. Buenas. Estoy haciendo un servidor de pruebecilla, y preparandome la funcion que me inicializaría socket y devolvería descriptor, me ha sucedido un error bastante extraño ...
  #1 (permalink)  
Antiguo 04/08/2010, 23:49
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 14 años, 3 meses
Puntos: 2
Problema gordo con la funcion socket()

Buenas. Estoy haciendo un servidor de pruebecilla, y preparandome la funcion que me inicializaría socket y devolvería descriptor, me ha sucedido un error bastante extraño con la funcion socket().

Estoy siguiendo multitud de tutoriales, he mirado mucha documentación y nada, llevo con esto toda la noche (probablemente sea un fallo tonto, pero no caigo).

Aquí dejo el código:

Código PHP:
# include "net.hpp"

int Net::StartSocket(int port)
{
    
struct sockaddr_in address;
    
struct sockaddr Cliente;
    
socklen_t Longitud_Cliente;
    
struct servent *_port;
    
int handler;

    
/*
    * se abre el socket
    */
    
handler socket(AF_INETSOCK_STREAM0);
    if (
handler == -1)
         return -
1;

    
_port getservbyport(port"tcp");
    if (
_port == NULL)
        return -
1;

    
/*
    * Se rellenan los campos de la estructura Direccion, necesaria
    * para la llamada a la funcion bind()
    */
    
address.sin_family AF_INET;
    
address.sin_port _port->s_port;
    
address.sin_addr.s_addr INADDR_ANY;

    if (
bind(handler, (struct sockaddr *)&addresssizeof(address)) == -1)
    {
        
close (handler);
        return -
1;
    }

    
/*
    * Se avisa al sistema que comience a atender llamadas de clientes
    */
    
if (listen (handler0) == -1)
    {
        
close (handler);
        return -
1;
    }

    
/*
    * Se devuelve el descriptor del socket servidor
    */
    
return handler;

Seguramente el codigo sea de lo más absurdo. He toqueteado miles de cosas...

Sé que el error está en socket porque he ido cambiando los valores de retorno de -1 a 0 uno por uno, y es en ese punto donde siempre me daba error.

¿Alguien tiene idea?

EDIT: De paso aprovecho para saludar, es mi primer post en Foros del Web, aunque llevaba tiempo solucionandome la vida este foro, jejeje
  #2 (permalink)  
Antiguo 05/08/2010, 04:03
 
Fecha de Ingreso: agosto-2009
Mensajes: 16
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: Problema gordo con la funcion socket()

pero que error te da?

si estas trabajando con winsock puede que sea por no iniciar WSA. por cierto si estas trabajando con winsock imprime WSAGetLastError() que te dara el codigo de error y te dira exactamente cual es el problema
la estructura para almacenar los datos del cliente como es que la tienes ahi si no estas manejando las conexiones entrantes?
  #3 (permalink)  
Antiguo 05/08/2010, 05:11
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Problema gordo con la funcion socket()

2 cambios haria yo:
- El que creo haria todo funcionar: quitar el & a address.
if (bind(handler, (struct sockaddr *)&address, sizeof(address)) == -1)
quedaria
if (bind(handler, (struct sockaddr *)address, sizeof(address)) == -1)

y, por otro lado, desconozco la funcion getservbyport(), yo hubiera hecho
address.sin_port = htons(port);

Mirar tambien:
http://www.umiacs.com/sockaddr_inman.html
  #4 (permalink)  
Antiguo 05/08/2010, 10:43
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 14 años, 3 meses
Puntos: 2
Respuesta: Problema gordo con la funcion socket()

Cita:
Iniciado por tig0 Ver Mensaje
pero que error te da?

si estas trabajando con winsock puede que sea por no iniciar WSA. por cierto si estas trabajando con winsock imprime WSAGetLastError() que te dara el codigo de error y te dira exactamente cual es el problema
la estructura para almacenar los datos del cliente como es que la tienes ahi si no estas manejando las conexiones entrantes?
Estoy trabajando en linux.

Esa estructura no tiene mucho que ver, ya que el error se produce en
Código PHP:
handler socket(AF_INETSOCK_STREAM0);
    if (
handler == -1)
         return -
1
Cita:
2 cambios haria yo:
- El que creo haria todo funcionar: quitar el & a address.
if (bind(handler, (struct sockaddr *)&address, sizeof(address)) == -1)
quedaria
if (bind(handler, (struct sockaddr *)address, sizeof(address)) == -1)

y, por otro lado, desconozco la funcion getservbyport(), yo hubiera hecho
address.sin_port = htons(port);

Mirar tambien:
http://www.umiacs.com/sockaddr_inman.html
Si quito el &, me sale error de compilacion. De todos modos, el error se produce antes.

he usado "address.sin_port = htons(port);", aunque todo siga igual. El error está en la funcion socket(), ahora que lo pienso: no puede ser que mi sistema operativo no puede abrir socket por lo que sea??

--------------------------------------------------------------------------------------------------------------------------------------------------------------

Vaaaaaaaaaaale, ahora me encaja un poco mejor. El error no esta en socket, sino en bind(). Voy a investigarlo mas, aunque sigo perdidillo

Última edición por Patonsky1; 05/08/2010 a las 10:46 Razón: Error
  #5 (permalink)  
Antiguo 05/08/2010, 11:01
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 14 años, 3 meses
Puntos: 2
Respuesta: Problema gordo con la funcion socket()

Solucionado, gente. El problema era que para bindear un socket, necesitaba ser superusuario, bastó con ejecutar la aplicacion con sudo. Lo extraño es que, al no cerrar el puerto (aunque no hubiera bindeado bien) se quedaba ocupado, por lo tanto cuando voy a usar el mismo puerto con sudo, me dice que está ocupado xDDD

Muchas gracias a los que comentaron por la ayuda ^^

Etiquetas: funcion, socket
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:46.