elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  API SOCKET -- ws2_32 ---
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: API SOCKET -- ws2_32 ---  (Leído 2,838 veces)
oPen syLar


Desconectado Desconectado

Mensajes: 769


The Best of You..


Ver Perfil WWW
API SOCKET -- ws2_32 ---
« en: 27 Diciembre 2006, 20:23 pm »

Cuando intento utilizar la fn accept siempre me devuelve SOCK_INVALID, pero aun asi establece la conexion con el client..... Y no puedo utilizar las fn send y recv.. bueno aqui esta el codigo.... Bueno con unos cuantos cambios que le hecho...

Option Explicit

'Servidor simple con Sockets del API Winsock2.
'Autor: HaXprT
'Fecha: 01/03/2002
'Ultima actualización: 05/03/2002

'Constantes del API Winsock 2
Private Const INVALID_SOCKET = -1
Private Const SOCKET_ERROR = -1
Private Const WSADESCRIPTION_LEN = 256
Private Const WSASYSSTATUS_LEN = 128
Private Const AF_INET = 2
Private Const INADDR_ANY = 0
Private Const SOCK_STREAM = 1
Private Const SOCK_DGRAM = 2


'Tipos de Datos del API Winsock 2
Private Type WSAData_Type
    wVersion As Integer
    wHighVersion As Integer
    szDescription(WSADESCRIPTION_LEN) As Byte
    szSystemStatus(WSASYSSTATUS_LEN) As Byte
    iMaxSockets As Integer  'U_SHORT
    iMaxUdpDg As Integer    'U_SHORT
    lpVendorInfo As Long
   
End Type

'Estructura IN_ADDR implementada sin uniones
Private Type IN_ADDR
    S_addr As Long  'U_LONG
   
End Type

Private Type SOCKADDR_IN
    sin_family As Integer
    sin_port As Integer 'U_SHORT
    sin_addr As Long
    sin_zero(7) As Byte 'array de 8 bytes
   
End Type

'Funciones del API Winsock 2
' Ojo, probar con "ws2_32"
Private Declare Function socket Lib "ws2_32" (ByVal AF As Long, _
ByVal Tipo As Long, _
ByVal Protocol As Long) As Long

Private Declare Function WSAStartup Lib "ws2_32" (ByVal wVersionRequested As Integer, _
ByRef lpWSAData As Any) As Long

Private Declare Function WSACleanup Lib "ws2_32" () As Long

Private Declare Function WSAGetLastError Lib "ws2_32" () As Long

Private Declare Function htons Lib "ws2_32" (ByVal hostshort As Integer) As Long 'U_SHORT

Private Declare Function bind Lib "ws2_32" (ByVal s As Long, _
name As SOCKADDR_IN, _
ByVal namelen As Long) As Long

Private Declare Function listen Lib "ws2_32" (ByVal s As Long, _
ByVal backlog As Long) As Long

Private Declare Function send Lib "ws2_32" (ByVal Sock As Long, _
ByVal Buf As Byte, _
ByVal Lenght As Long, _
ByVal Flags As Long) As Long

Private Declare Function accept Lib "ws2_32" (ByVal hSock&, _
from As SOCKADDR_IN, _
ByVal LenFrom&) As Long

Private Declare Function recv Lib "ws2_32" (ByVal Sock As Long, _
ByVal Buf As Byte, _
ByVal Lenght As Long, _
ByVal Flags As Long) As Long

Private Declare Function closesocket Lib "ws2_32" (ByVal s As Long) As Long

Dim SockServer As Long
Function MakeWord(ByVal low As Byte, ByVal high As Byte) As Integer

MakeWord = high * 256 + low

End Function

Function LoByte(ByVal Num As Integer) As Byte

LoByte = Num And 255

End Function

Function HiByte(ByVal Num As Integer) As Byte

Num = Num / 256
HiByte = Num And 255

End Function

Function ComplementoADos(Num As Long) As Integer
' Esta función recibe un número entero que debe estar entre 0..65535,
' el cual es el rango para un tipo de dato unsigned short en C,
' y lo convierte a un valor equivalente para ser almacenado en un
' tipo de dato Integer de Visual Basic (-32768..32767)

If Num > 32767 Then
Num = Num - 1
ComplementoADos = -(Num Xor 65535)

    Else
    ComplementoADos = Num
   
End If

End Function

Function ByteArrayToString(Arreglo() As Byte, Tamaño As Long) As String
Dim Str As String
Dim i As Integer

For i = 0 To Tamaño - 1
    Str = Str & Chr(Arreglo(i))
   
Next

ByteArrayToString = Str

End Function

'*** Mis Funciones de Alto Nivel ***
' Inica el socket del servidor y lo retorna si todo sale bien.
' En caso de fallo retorna SOCKET_ERROR
Private Function IniciarSocketServidor(Puerto As Long, Cola As Long) As Long
Dim Error As Long
Dim wVersionRequested As Integer
Dim Sin As SOCKADDR_IN
Dim wsaData As WSAData_Type

wVersionRequested = MakeWord(2, 2)
Error = WSAStartup(wVersionRequested, wsaData)

If Error <> 0 Then

    MsgBox "error", vbExclamation, "Socket Invalido 1"
    IniciarSocketServidor = SOCKET_ERROR
    Exit Function

End If

If (LoByte(wsaData.wVersion) <> 2) Or (HiByte(wsaData.wVersion) <> 2) Then

    Call WSACleanup
    MsgBox "Socket Invalido, Versión de Winsock Incorrecta", vbExclamation, Error
    IniciarSocketServidor = SOCKET_ERROR
   
Exit Function

End If

SockServer = socket(AF_INET, SOCK_STREAM, 0)

If SockServer = INVALID_SOCKET Then

    Error = WSAGetLastError()
    Call WSACleanup
    MsgBox "Error al llamar a socket: " & Error, vbExclamation, "Error"
    IniciarSocketServidor = SOCKET_ERROR
    Exit Function
   
End If

Sin.sin_family = AF_INET
Sin.sin_addr = INADDR_ANY
Sin.sin_port = ComplementoADos(htons(Puerto))

If bind(SockServer, Sin, Len(Sin)) = SOCKET_ERROR Then

    Error = WSAGetLastError()
    closesocket SockServer
    Call WSACleanup
    closesocket (SockServer)
    MsgBox "Error al llamar a bind: " & Error, vbExclamation, "Error"
    IniciarSocketServidor = SOCKET_ERROR
    Exit Function

End If

If listen(SockServer, Cola) = SOCKET_ERROR Then

    Error = WSAGetLastError()
    closesocket SockServer
    Call WSACleanup
    MsgBox "Error al llamar a listen: " + Error, vbExclamation, "Error"
    IniciarSocketServidor = SOCKET_ERROR
    Exit Function
   
End If

IniciarSocketServidor = SockServer

End Function

Private Function AcceptLoop(SockServ As Long)

Dim Buf(255) As Byte, N As Long, hSock&, from As SOCKADDR_IN

Do

hSock = accept(SockServ, from, Len(from))

Debug.Print "bucle"

Loop While hSock = INVALID_SOCKET

Debug.Print "hSock = " & hSock

Do
N = 0

N = recv(SockServ, Buf(0), UBound(Buf), 0)
If N > 0 Then
Debug.Print "Se recibió: " & ByteArrayToString(Buf, N)

    Else
    Debug.Print N

End If

N = send(SockServ, Buf(0), N, 0)
If N > 0 Then
Debug.Print "Se envió: " & ByteArrayToString(Buf, N)

    Else
    Debug.Print N

End If

DoEvents

Loop

End Function

Private Sub cndCerrar_Click()

closesocket SockServer
Unload Me

End Sub

Private Sub CommandIniciarSocket_Click()
Dim SockServer As Long

SockServer = IniciarSocketServidor(Val(TextPuerto.Text), 5)
If SockServer <> SOCKET_ERROR Then Call AcceptLoop(SockServer)

End Sub


En línea

Siempre habra 2 verdades, la que quieres creer y la que no aceptaras
~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.981


Ver Perfil WWW
Re: API SOCKET -- ws2_32 ---
« Respuesta #1 en: 28 Diciembre 2006, 02:07 am »

Hola:

No me e leido el code entero la verdad, por q es muy largo... pero me imagino q e lfallo estara en la api del winsock. Mira aki tienes unos ejemplos muy buenos para no tener q usar la Ocx:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=52072&lngWId=1

Enplea los modulos  :P
Espero q asi te funcione

1S4ludo


En línea

Sancho.Mazorka


Desconectado Desconectado

Mensajes: 480


Gamer & Programador


Ver Perfil WWW
Re: API SOCKET -- ws2_32 ---
« Respuesta #2 en: 31 Diciembre 2006, 23:50 pm »

Debes tener algun error en alguna declaracion o algo asi, por favor cuando pongas codigo ponle la opcion de codigo, xq se hace muy dificil leerlo si no!


Sancho.Mazorka     :P
En línea

Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html


oPen syLar


Desconectado Desconectado

Mensajes: 769


The Best of You..


Ver Perfil WWW
Re: API SOCKET -- ws2_32 ---
« Respuesta #3 en: 1 Enero 2007, 07:58 am »

Quiero aprender a programar con la APi...!
En línea

Siempre habra 2 verdades, la que quieres creer y la que no aceptaras
Sancho.Mazorka


Desconectado Desconectado

Mensajes: 480


Gamer & Programador


Ver Perfil WWW
Re: API SOCKET -- ws2_32 ---
« Respuesta #4 en: 1 Enero 2007, 08:02 am »

CMP Programmader bajate de aca la API Guide te va a ayudar mucho.

www.allapi.net



Sancho.Mazorka     :P
En línea

Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html


~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.981


Ver Perfil WWW
Re: API SOCKET -- ws2_32 ---
« Respuesta #5 en: 1 Enero 2007, 19:16 pm »

Con los ejemplos q te e dejado no se done esta el problema... funciona = q el wissock  :o
En línea

oPen syLar


Desconectado Desconectado

Mensajes: 769


The Best of You..


Ver Perfil WWW
Re: API SOCKET -- ws2_32 ---
« Respuesta #6 en: 6 Enero 2007, 22:20 pm »

tu dices en el cod que puse..???


Fijate cuando se llama a la fn accept devuelve un 0.. cuando deberia devolver el handle para utilizarlo con las fns recv y send...!
En línea

Siempre habra 2 verdades, la que quieres creer y la que no aceptaras
~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.981


Ver Perfil WWW
Re: API SOCKET -- ws2_32 ---
« Respuesta #7 en: 7 Enero 2007, 11:58 am »

No, yo me refria a

Hola:

No me e leido el code entero la verdad, por q es muy largo... pero me imagino q e lfallo estara en la api del winsock. Mira aki tienes unos ejemplos muy buenos para no tener q usar la Ocx:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=52072&lngWId=1

Enplea los modulos  :P
Espero q asi te funcione

1S4ludo

Añades los dos modulos y te olvidas, funciona igual q un ws, menos por dos detalles de nada, pero bamos q viene muy bien explicado

1S4ludo
En línea

oPen syLar


Desconectado Desconectado

Mensajes: 769


The Best of You..


Ver Perfil WWW
Re: API SOCKET -- ws2_32 ---
« Respuesta #8 en: 9 Enero 2007, 00:12 am »

muchaho tu si sabes.......................! thanks...!
En línea

Siempre habra 2 verdades, la que quieres creer y la que no aceptaras
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Linkear ws2_32
Programación C/C++
noele1995 2 1,995 Último mensaje 22 Agosto 2013, 21:28 pm
por noalg
Sockets en c++ y Ws2_32.lib y error
Programación C/C++
patilanz 7 4,595 Último mensaje 4 Mayo 2014, 19:37 pm
por patilanz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines