Información API:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx (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 acptEste me arroja un error:
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.
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
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:
push 0x10
mov edx, esp
La estructura se puede hacer igual.
push 0xbcee0200
mov ecx, esp
Pero el error esta en addrlen como indica ese WSAEFAULT.
Un saludo.
Era lo que me comentaban, muchísimas gracias a ambos, saludos :)