[Solucionado]Problema con API accept (WINSOCK)

Iniciado por .:UND3R:., 12 Mayo 2013, 02:08 AM

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

.:UND3R:.

Información API:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx

Siguiendo con el estudio de WINSOCK estoy algo confundido con respecto a la API accept, ya que si pongo los parámetros:

Citar_Out_    struct sockaddr *addr,
 _Inout_  int *addrlen

LÍNEA 55: invoke accept,sock,addr acpt,sizeof acpt

Este me arroja un error:

Código (asm) [Seleccionar]
TITLE  cliente

.386
option casemap:none
.model flat,stdcall
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\ws2_32.inc

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib  c:\masm32\lib\ws2_32.lib

.const

.data
wsadata WSADATA <>
sin sockaddr_in <>
acpt sockaddr <>

errort    byte "Error Server",0 ; temp
error1    byte "Error WSAStartup",0 ; temp
error2  byte "Error socket",0 ; temp
error3  byte "Error listen",0 ; temp
error4  byte "Error bind",0 ; temp

look  byte "Conexión recibida",0 ; temp

Port  equ 61116

.data?
sock SOCKET ?

.code
main PROC
invoke WSAStartup,101h,addr wsadata
.if eax!=NULL
invoke MessageBox,NULL,addr error1,addr errort,MB_ICONERROR + MB_OK ; temp
.else
invoke socket,AF_INET,SOCK_STREAM,0

.if eax!=INVALID_SOCKET
mov sock,eax
mov sin.sin_family,AF_INET
mov sin.sin_addr,INADDR_ANY
invoke htons,Port
mov sin.sin_port,ax

invoke bind,sock,addr sin,sizeof sin
.if eax!=SOCKET_ERROR
invoke listen,sock,15
.if eax!=SOCKET_ERROR
.while(TRUE)
invoke accept,sock,addr acpt,sizeof acpt
.if eax!=SOCKET_ERROR
invoke MessageBox,NULL,addr look,addr errort,MB_ICONERROR + MB_OK ; temp
.else
invoke WSAGetLastError
.endif
.endw
.else
invoke MessageBox,NULL,addr error3,addr errort,MB_ICONERROR + MB_OK ; temp
.endif
.else
invoke MessageBox,NULL,addr error4,addr errort,MB_ICONERROR + MB_OK ; temp
.endif
.else
invoke MessageBox,NULL,addr error2,addr errort,MB_ICONERROR + MB_OK ; temp
.endif
.endif

   invoke ExitProcess,0
main ENDP
END main


¿Cómo soluciono esto?
¿Para que sirve exactamente estos parámetros?

Gracias y saludos.

EDIT: El error generado al llamar accept es el siguiente:

271E (WSAEFAULT)   An invalid argument was supplied to the Windows Sockets API.

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

mr.blood

Prueba cambiandolo por LÍNEA 55: invoke accept,sock,addr acpt,addr len (len seria un DWORD)

En la MSDN se especifica que es un puntero de entrada/salida de datos.

Sa1uDoS

cpu2

Hola

Como indica MSDN addrlen es un puntero que cuenta el tamaño de la estructura addr, como estas utilizando sockaddr_in son 16 bytes.

Ejemplo:

Código (asm) [Seleccionar]
push 0x10
mov edx, esp


La estructura se puede hacer igual.

Código (asm) [Seleccionar]
push 0xbcee0200
mov ecx, esp


Pero el error esta en addrlen como indica ese WSAEFAULT.

Un saludo.

.:UND3R:.

Era lo que me comentaban, muchísimas gracias a ambos, saludos  :)

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)