C/Visual C - Por qué ocurre esto????

 
Vista:

Por qué ocurre esto????

Publicado por Germán (9 intervenciones) el 17/06/2003 10:11:00
Quiero conseguir la dirección ip de mi ordenador y mostrarla en una caja de texto.
cliente = accept(sock, (struct sockaddr*) &clientaddr.sin_addr, &MySock.addrlen); Con esto creo q guardo la dirección ip en clientaddr.sin_addr, luego a la hora de mostrarlo, lo hago en un mensaje, asi:
MessageBox(hdlg,inet_ntoa(clientaddr.sin_addr),"Tu dirección de ip",MB_ICONERROR);
Mi duda es, me sale siempre la dirección ip como 0.0.0.0 parece q no me la coje bien, no se pq, mi otra duda, como lo dejo en una caja de texto en lugar de un mensaje?,muxas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Por qué ocurre esto????

Publicado por chuidiang (677 intervenciones) el 17/06/2003 10:31:44
Te comento un par de cosas un poco al azar, a ver si van por ahí los tiros.

Con accept () obtienes la ip del cliente que se ha conectado a tu programa, no la tuya misma.

Comprueba que accept() no te devuelve error y que efectivamente se ha conectado un cliente.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Por qué ocurre esto????

Publicado por Germán (9 intervenciones) el 17/06/2003 11:14:38
accept no creo q de error, pq en la aplicación el cliente se conecta y puede perfectamente hablar con otros usuarios que esten conectados, yo hago accept en el momento en el que el usuario quiere conectar con el servidor, el usuario debe insertar la dirección ip del servidor para poder conectar con el, ademas del protocolo y un nombre de usuario, en ese momento es cuando hago el accept. Luego mas tarde tengo un menu en la pantalla del usuario, en la que quiero q tenga la posibilidad de ver su dirección ip, ahi es donde hago el mensaje. Quiero obtener la dirección ip del cliente que la solicita mediante el menu.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Por qué ocurre esto????

Publicado por chuidiang (677 intervenciones) el 17/06/2003 22:30:57
Veamos.

En el servidor, si escribes directamente la dirección ip del cliente que has obtenido con accept(), justo después del accept(), ¿es correcta o es 0.0.0.0?

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Por qué ocurre esto????

Publicado por Germán (9 intervenciones) el 18/06/2003 09:15:36
En el codigo del cliente es donde se hace el accept, justo cuando el usuario elige protocolo e inserta la dirección ip pa conectar, se hace el accept y se guarda en clientaddr.sin_addr como me dijistes, justamente ahi, si le hago un inet_ntoa, me sale 0.0.0.0, parece q no la coje bien, no se pq, gracias por todo tio, me estas ayudando muxo ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Por qué ocurre esto????

Publicado por chuidiang (677 intervenciones) el 18/06/2003 10:35:50
El servidor es el que espera la conexión y es el que hace accept(). El cliente es que el que establece la conexión y usa la función connect().

En tu servidor deberías tener

socket();
bind();
accept();

En tu cliente deberías tener

socket();
connect();

El servidor, en accept() obtiene la dirección ip del cliente que se ha conectado, que no debería ser 0.0.0.0 salvo cosas extrañas.

Otra pequeña consulta. ¿Usas TCP (SOCK_STREAM en socket()) o UDP (SOCK_DGRAM en socket())?

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Por qué ocurre esto????

Publicado por Germán (9 intervenciones) el 20/06/2003 09:30:47
en mi servidor tengo por ejemplo:
if (bind(ServSocks->sock,&ServSocks->addr,ServSocks->addrlen) == SOCKET_ERROR)
if (bind(SAPSocket, (PSOCKADDR) &SAPSockAddr, sizeof(SOCKADDR_IPX)) == SOCKET_ERROR)
if ((ConnectedSockets[NextFree].sock = accept(ServerSockets[k].sock,
&ConnectedSockets[NextFree].addr,
&addrlen)) == INVALID_SOCKET)
ya ta, el servidor solo tienes esos accept y bind, sigo diciendo que el cliente tiene su funcion accept para conectar con el servidor, q es en la que yo intento guardar la direccion ip para luego mostrarla, creo q uso TCP, yo de eso no tengo muxa idea, al conectar le digo un protocolo q siempre es TCP/IP,
Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Por qué ocurre esto????

Publicado por Germán (9 intervenciones) el 20/06/2003 10:20:38
hola otra vez chuidiang, uff a ver cuando voy a poder sacar esto, he conseguido mediante la funcion WSAGetLastError y WSASetLastError el código del error q se produce, el cual sera el causante supongo de q me salga la dirección ip como 0.0.0.0, la definición del error dice algo tal que asi: Socket operation on nonsocket.
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.
Ya se cual es el error pero no se la solucion al problema, gracias por todo, me estas ayudando muxo :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Por qué ocurre esto????

Publicado por chuidiang (677 intervenciones) el 20/06/2003 14:13:34
Bueno, veo cosillas raras.
En el servidor creas un socket

unSocket = socket (...);

Ese es el que debes usar para el bind

bind (unSocket);

y ese es el que debes usar con todos los accept() que hagas en el servidor

int conexionesConClientes[10];
int conexionLibre = 0;

while (conexionLibre < 10)
{
conexionesConCliente[conexionLibre] = accept (unSocket, ...);
conexionLibre++;
}

Esto atiende a 10 clientes, y por supuesto, el código real será algo más complejo (debes lanzar hilos o usar select(), puesto que accept() se queda bloqueado), esto es solo la idea. accept() se hace siempre con el socket del bind() y cada accept() te devuelve un entero, que es la conexión con el cliente.

En cuanto al cliente, no debes hacer accept(), ni bind(), solo socket() y connect().

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar