Solucionar WSAEWOULDBLOCK

Iniciado por Vaagish, 16 Mayo 2013, 00:33 AM

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

Vaagish

Hola amigos! Tengo el siguiente problema que me esta torturando... ya llevo horasss...

Bueno, el codigo primero:



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 !!

MCKSys Argentina

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Vaagish

#2
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 ? :(

Vaagish

#3
Ok! Solucionado...




...

.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  :¬¬