Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Vaagish en 16 Mayo 2013, 00:33 am



Título: Solucionar WSAEWOULDBLOCK
Publicado por: Vaagish en 16 Mayo 2013, 00:33 am
Hola amigos! Tengo el siguiente problema que me esta torturando... ya llevo horasss...

Bueno, el codigo primero:

Código:

Conn:
invoke connect, sock, addr sa, sizeof sa

.IF eax==SOCKET_ERROR

     invoke WSAGetLastError

     .IF eax==WSAEWOULDBLOCK

          jmp Conn

     .ELSEIF eax==WSAEALREADY

  jmp Conn

     .ELSE

  ;Por lo general, conexion establecida u otro ErrorCode

     .ENDIF

.ENDIF

Ok,, estoy usando el ejemplo de Iczelion, con Socket y procedimiento de ventana...
El problema esta en que la conexion queda trancada en error: WSAEWOULDBLOCK, y por lo que entendi de este error es algo asi como: "Dame un minuto que estoy intentando conectar" jajaja Bueno, no es asi literalmente, pero seria algo asi, "socket ocupado". Como el ejemplo funciona con procedimientos de ventana, el programa se cuelga al quedar en un bucle de conexion infinito, (intentando conectar y haciendo loop en volver a conectar...)
entonces la ventana no aparece siquiera..
Se me ocurre poner un timer, pero no tengo ni idea por donde empezar... Alguna sugerencia o algun metodo timer pleaseee!!

Thnks all !!


Título: Re: Solucionar WSAEWOULDBLOCK
Publicado por: MCKSys Argentina en 16 Mayo 2013, 08:35 am
La MSDN dice que pruebes con select: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx)

Eso sale de la parte de Return value de connect: http://msdn.microsoft.com/en-us/library/windows/desktop/ms737625(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms737625(v=vs.85).aspx)


Título: Re: Solucionar WSAEWOULDBLOCK
Publicado por: Vaagish en 16 Mayo 2013, 19:43 pm
Nuu, es verdad.. como me olvide del select.. Muchas gracias MCKSys! Voy a intentarlo, si no lo logro sigo este hilo..

EDITADO:

Bueno, había escrito un montón de cosas y se me expiro la sesión, así que voy a ser breve...

La msdn dice que no puedo usar o que no seria lo correcto ( entiendo yo ) usar select porque estoy usando WSAAsyncSelect, y cuando conecta me envía FD_CONNECT como un mensaje a la ventana,, eso todo bien... el problema es que al parecer, connect se pisa el palito comparado con:

Conn:
invoke connect....
cmp eax, 0
jne Conn

o sea, me fijo si me conecte demasiado rápido y no le doy tiempo a connect...
parece que volví al principio...  timer quizás ? :(


Título: Re: Solucionar WSAEWOULDBLOCK
Publicado por: Vaagish en 16 Mayo 2013, 22:04 pm
Ok! Solucionado...


Código:

...

.ELSEIF uMsg==WM_SOCK

     mov edx, lParam

          .IF dx==FD_CONNECT

       shr edx, 16
      .IF dx==NULL

      ;Conexion establecida
       invoke send, sock, addr szSockStr, sizeof szSockStr, 0

          .ELSE

;Error
mov eax, OFFSET ThreadProc
invoke CreateThread, NULL, NULL, eax, NULL, NORMAL_PRIORITY_CLASS, ADDR ThreadID

invoke CloseHandle, eax

   .ENDIF


Listo.. he ahi la solucion.. vale aclarar que la conexion la hace un hilo.. asi no me tranca la ventana..
Y esta bueno comentar que si uso esto:

invoke CreateThread, NULL, NULL, eax, NULL, CREATE_SUSPENDED, ADDR ThreadID  

O sea, le pongo la flag CREATE_SUSPENDED, y luego resumethread, el antivirus salta como pelota de goma jajaja

Conste que mis .IF y .ELSEIF estaban bien ubicados  :¬¬