Ver Mensaje Individual
  #4 (permalink)  
Antiguo 01/06/2014, 13:27
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Sockets entre Java y C++

Primero lo facil: añade el namespace std:

Código C++:
Ver original
  1. #include <string>
  2. using namespace std;
  3.  
  4. int main() {
  5.     string texto = "ok";//ya no necesitas std::
  6.     ...
  7. }


"...he probado a intentar enviar un string con el código que me has puesto, pero me da un error en el servidor: Error: Connection reset..."

Ok, añade todas las comprovaciones de error en las funciones de sockets. P.ej. la funcion 'connect' retorna SOCKET_ERROR cuando no puede conectar ademas de aplicar un error que recuperas con WSAGetLastError(). Todas las funciones de sockets funcionan de forma similar: comprueba que retorna el valor esperado, en caso contrario recuperas el codigo del error y buscas en la tabla de codigos de error la descripcion que le corresponde (asi sabes donde encarar la correccion).

Si la aplicacion llega a 'send' sin lanzar ningun error entonces asegurate de que se estan enviando datos: send retornará SOCKET_ERROR en caso de error y >=0 en caso de exito, pero si retorna 0 aun siendo caso de existo es que algo esta sucediendo con el buffer de datos proporcionado, en este caso texto.c_str()

Otra cosa: respeta el tiempo de dialogo cliente-servidor. Si defines que el dialogo es algo como esto:

s: escucha
c: pide conexion
s: acepta conexion
(s: escribe saludo inicial, no es necesario)
(c: lee saludo inicial, no es necesario)
c: escribe consulta
s: lee consulta
s: escribe recurso
s: finaliza conexion
c: lee recurso
c: finaliza conexion
(s: aqui sigue escuchando para nuevas conexiones)

entonces tienes que esperar a cerrar el socket del cliente hasta que hayas leido lo que el servidor te responde; si cierras antes el servidor intenta el envio pero encuentra que no existe el cliente al que debe responder. En cualquier caso en situaciones normales si el servidor intenta el envio pero el cliente ha desconectado simplemente se descarta la peticion y cierra el socket (aun cuando se notifique un error).

La forma facil de encontrar 'cosas' es printar por consola todos los resultados que vas obteniendo: los valores de retorno de las funciones, el texto que esperas enviar, los bytes realmente enviados, etc... De todas formas ejecuta la aplicacion en el depurador, puede que haya algo el el codigo que no esté del todo bien.

Y, tal vez ya lo hayas leido, puedes echar un vistazo a la guia beej de programacion de sockets; puedes encontrarla por ahi, y en varios idiomas :)
Prueba esto de volcar los datos por pantalla, a ver si ves algo sospechoso o te lanza algun error.

Suerte

Saludos
vosk