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

Sockets Congelado

Estas en el tema de Sockets Congelado en el foro de C/C++ en Foros del Web. Tengo este codigo, el cual se conecta a un servidor en un ordenador de la red local. Código: tcppeer.sin_family = AF_INET; tcppeer.sin_port = htons(puerto); tcppeer.sin_addr.s_addr ...
  #1 (permalink)  
Antiguo 15/04/2015, 11:29
 
Fecha de Ingreso: agosto-2010
Mensajes: 20
Antigüedad: 14 años, 2 meses
Puntos: 0
Pregunta Sockets Congelado

Tengo este codigo, el cual se conecta a un servidor en un ordenador de la red local.
Código:
tcppeer.sin_family = AF_INET;
	tcppeer.sin_port = htons(puerto);
	tcppeer.sin_addr.s_addr = inet_addr(ip);

	tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	if (tcp_socket != INVALID_SOCKET)
	{
		WriteDebug("a", "opened succesfully\n");
		rt = opened;
	}
	else {

		sprintf(temp, " opening error : %d \n", WSAGetLastError());
		WriteDebug("a", temp);
		rt = off;
	}

	if (connect(tcp_socket, (struct sockaddr*)&tcppeer, sizeof(tcppeer)))
	{
		closesocket(tcp_socket);
		sprintf(temp, "Unable to connect server :host %s: %u, error: %u \n", ip, puerto, WSAGetLastError());
		WriteDebug("a", temp);
		rt = off;
	}
Mi problema es que si el servidor esta a la escucha conecta perfectamente, si no se queda 1 minuto congelado la aplicacion empieza a poner no responde,etc etc y sigue dentro del ultimo if tan normal. Creo que puede ser un tema de que intenta reconectar muchas veces hasta que se cansa...Como puedo hacer que no este ese minuto congelada la pantalla?

Gracias de antemano!
  #2 (permalink)  
Antiguo 15/04/2015, 14:07
 
Fecha de Ingreso: febrero-2015
Ubicación: France
Mensajes: 12
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Sockets Congelado

Hola,

Ha intenta con O_NONBLOCK ?

Por ejemplo :

Código:
#include <fcntl.h>

/*...*/

int estado;

tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if ((estado = fcntl(tcp_socket, F_GETFL, 0)) == -1) /* intenta de recuperar flags */
        estado = 0; 

fcntl(tcp_socket, F_SETFL, estado | O_NONBLOCK) /* y añadir el estado "no bloqueando" */


/*...*/
  #3 (permalink)  
Antiguo 18/04/2015, 11:56
 
Fecha de Ingreso: agosto-2010
Mensajes: 20
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Sockets Congelado

Cita:
Iniciado por Reynolds Ver Mensaje
Hola,

Ha intenta con O_NONBLOCK ?

Por ejemplo :

Código:
#include <fcntl.h>

/*...*/

int estado;

tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if ((estado = fcntl(tcp_socket, F_GETFL, 0)) == -1) /* intenta de recuperar flags */
        estado = 0; 

fcntl(tcp_socket, F_SETFL, estado | O_NONBLOCK) /* y añadir el estado "no bloqueando" */


/*...*/
No funciona
  #4 (permalink)  
Antiguo 18/04/2015, 16:10
 
Fecha de Ingreso: febrero-2015
Ubicación: France
Mensajes: 12
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Sockets Congelado

He intentado este codigo con un servidor mio. Me parece funcionar, incluso sin O_NONBLOCK :


Código:
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#include <fcntl.h>
	

int main()
{
	int puerto = 1025;
	char *ip = "127.0.0.1";
	struct sockaddr_in tcppeer;
	int tcp_socket;
	
	tcppeer.sin_family = AF_INET;
	tcppeer.sin_port = htons(puerto);
	tcppeer.sin_addr.s_addr = inet_addr(ip);

	tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	if (tcp_socket > 0)
	{
		printf("opened succesfully\n");
	}
	else 
	{
		fprintf(stderr, " opening error : %d \n", errno);

	}

	if (connect(tcp_socket, (struct sockaddr*)&tcppeer, sizeof(tcppeer)))
	{
		shutdown(tcp_socket, SHUT_RDWR);
		fprintf(stderr, "Unable to connect server :host %s: %u, error: %d \n", ip, puerto, errno);
	}

}
Si el servidor esta conectado hay "opened succesfully" escrito,
y si no esta conectado hay inmediato : "Unable to connect server :host 127.0.0.1: 1025, error: 107" escrito en la pantalla (107 porque errno 107 es "ENOTCONN").

Pienso que el problema de tiempo es dentro la funcion "closesocket()" o "WSAGetLastError()". ¿ Que son sus implementaciónes ? ¿Podrias intentar eso y decir que se pasa ? :


Código:
if (connect(tcp_socket, (struct sockaddr*)&tcppeer, sizeof(tcppeer)))
{
        fprint(stderr, "punto uno\n");
		closesocket(tcp_socket);
		sprintf(temp, "Unable to connect server :host %s: %u, error: %u \n", ip, puerto, WSAGetLastError());
        fprint(stderr, "punto dos");
		WriteDebug("a", temp);
		rt = off;
}

Etiquetas: congelado, int, sockets
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 12:00.