Wer mag Sockets? stdc.mod, socketstream.mod

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

DivineDominion

Betreff: Wer mag Sockets? stdc.mod, socketstream.mod

BeitragSo, Jan 23, 2005 2:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe jetzt mehrere Stunden in den Modulen rumgewühlt, mir den undokumentierten Code angesehen, in bmx und c gleichermaßen und habe Sockettutorials angeschaut und komme schließlich zum Schluss, dass ich für sowas einfach zu blöd bin.

Hat schon jemand von euch mit Sockets gearbeitet? mit pub.mod/stdc.mod und brl.mod/stream.mod ebenfalls werden tolle Vorlagen geliefert um UDP zu realisieren. Ich kriegs nicht hin, bedauere es und bin verdammt sauer aber kanns nicht ändern. Nur falls jemand nicht wusste das diese Dinge da existieren, schreib ich das hierhin. Multiplayer mit UDP wär doch mal was.


Damit ich die zwei mir übriggebliebenen Links nicht alle verliere:
http://www.c-worker.ch/tuts/udp.html
http://www.linuxgazette.com/node/8758
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

Sebe

BeitragSo, Jan 23, 2005 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hui, Socketstreams. Ist ne Weile her, dass ich in C++ was damit gemacht habe. Die Module habe ich (siehe anderer Thread) auch schon gefunden und durchgesehen. Scheinbar kannst du Socketstreams fast ebenso benutzen wie Filestreams (soweit bin ich mitlerweile schon durch die BMX Struktur durchgestiegen). Man müsste sich halt bloss mal die Parameter des Sockettypes genauer ansehen. Aber da werde ich in nächster Zeit wohl eher nicht zu kommen Sad

bruZard

BeitragMi, Jan 26, 2005 11:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Um direkt mit Sockets zu arbeiten kannst Du das Modul Pub.stdc verwenden. Hierzu kann ich Dir folgende Seite empfehlen: http://www.pc-adviser.de/socke...erung.html

Über SocketStreams wäre die Sache noch etwas einfacher, Kopfzerbrechen bereitet mir dort aber die Aushandlung des zu verwendenden Ports.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

DivineDominion

BeitragMi, Jan 26, 2005 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe noch einige Sachen probiert am Sonntag und Montag und bin sehr stolz auf mich, auch wenn das Ergebnis =0 blieb.
Mein Problem ist, dass ich zwar annähernd verstehe, wie select_() funktioniert (habe noch andere Tutorien in den Bookmarks) aber es nicht auf BMax übertragen kann.
Schwierigkeiten bereiten mir da vor allem Dinge wie addr_len in accept_() was man dringend benötigt (sonst hilft select_() auch nicht, auch wenn ich das vielleicht sogar schon zum laufen brachte - nur eben keine verbindung annahm).

Ich schaffe das alleine schlichtweg nicht; die Nutzung dieser PArameter werden an anderen Stellen im Modul in C gelöst, wo man die passenden sockaddr-blabla-Dinger eben zur Hand hat. Was macht man denn dann bitte Neutral
christian.tietze@gmail.com - https://christiantietze.de
macOS

Vertex

BeitragDo, Jan 27, 2005 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also hier auch mal ein kleiner Ansatz von mir:
Code: [AUSKLAPPEN]
Strict

Const SOCK_STREAM      = 1
Const SOCK_DGRAM     = 2
const SOCK_RAW         = 3
const SOCK_RDM       = 4
const SOCK_SEQPACKET = 5

Const AF_UNIX    = 1
const AF_INET    = 2
const AF_IMPLINK = 3
Const AF_PUP     = 4
Const AF_CHAOS   = 5
Const AF_IPX     = 6
Const AF_NS      = 6
Const AF_ISO     = 7

Type TWSAData
   Field shVersion:Short
   Field shHighVersion:Short
   Field bDescription:Byte[256+1]
   Field bSystemStatus:Byte[128+1]
   Field shMaxSockets:Short
   Field shMaxUdpDg:Short
   Field pbVendorInfo:Byte Ptr
End Type

Type TSockAddr_In
   Field shSinFamily:Short
   Field shSinPort:Short
   Field lSinAddr:Int
   Field bSinZero:Byte[8]
End Type
      

Extern "OS"
   Function WSAStartup:Int(shVersion, tWSA:Byte Ptr)
   Function socket:Int(iDomain:Int, iType:Int, iProtocol:Int)
   Function connect(iSocket:Int, tSockAddr:TSockAddr_In, iAddrLen:Int)
   Function inet_addr:long(sURL:String)
   Function htons:Short(sHostshort:Short)
End Extern

Function MakeShort:Short(bA:Byte, bB:Byte)
   Return bA | (bB Shl 8)
End Function

Local tWSA:TWSAData
Local iSocket:Int
Local tAddress:TSockAddr_In

If WSAStartup(MakeShort(1, 1), tWSA) Then
   Print "Fehler1"
   End
End If

iSocket = socket(AF_INET, SOCK_STREAM, 0)
If iSocket = -1 Then
   Print "Fehler2"
   End
End If

tAddress = New TSockAddr_In
tAddress.shSinFamily = AF_INET
tAddress.shSinPort   = htons(80)
tAddress.lSinAddr    = inet_addr("http://blitzforum.de")
Print inet_addr("http://blitzforum.de")
Print htons(80)
Print AF_INET
Print SizeOf(tAddress)
Print iSocket
If connect(iSocket, tAddress, SizeOf(tAddress)) = -1 Then
   Print "Fehler3"
   End
End If


Ich habe noch keine Ahnung, warum connect mir -1 zurückliefert.

mfg olli

Edit:
Ja, man sollte bei Strukturen immer Byte Ptr benutzen:
Code: [AUSKLAPPEN]
   Function connect(iSocket:Int, tSockAddr:Byte Ptr, iAddrLen:Int)


funktioniert jedoch immer noch nicht

Edit2:
Code: [AUSKLAPPEN]
 Function inet_addr:int(sIP:String)

Die Funktion wandelt nur dotted IPs in int IPs um, jedoch weiß ich nciht, warum inet_addr("192.168.2.100") mir -1 zurückliefert, jedoch connect ohne Probleme eine Verbindung herstellt.
vertex.dreamfall.at | GitHub

Vertex

BeitragFr, Jan 28, 2005 0:46
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, das ganze geht jetzt einigermaßen...
Code: [AUSKLAPPEN]
Strict

Const SOCK_STREAM      = 1
Const SOCK_DGRAM     = 2
const SOCK_RAW         = 3
const SOCK_RDM       = 4
const SOCK_SEQPACKET = 5

Const AF_UNIX    = 1
const AF_INET    = 2
const AF_IMPLINK = 3
Const AF_PUP     = 4
Const AF_CHAOS   = 5
Const AF_IPX     = 6
Const AF_NS      = 6
Const AF_ISO     = 7

Type TWSAData
   Field shVersion:Short
   Field shHighVersion:Short
   Field bDescription:Byte[256+1]
   Field bSystemStatus:Byte[128+1]
   Field shMaxSockets:Short
   Field shMaxUdpDg:Short
   Field pbVendorInfo:Byte Ptr
End Type

Type TSockAddr_In
   Field shSinFamily:Short
   Field shSinPort:Short
   Field iSinAddr:Int
   Field lSinZero:Long
End Type
       

Extern "OS"
   Function WSAStartup:Int(shVersion, tWSA:Byte Ptr)
   Function socket:Int(iDomain:Int, iType:Int, iProtocol:Int)
   Function connect(iSocket:Int, tSockAddr:Byte Ptr, iAddrLen:Int)
   Function inet_addr(sIP:Byte Ptr)
   Function htons:Short(sHostshort:Short)
   Function WSAGetLastError:Int()
   Function send:Int(iSocket:Int, pMsg:Byte Ptr, iLen:Int, iFlags:Int)
   Function recv:Int(iSocket:Int, pMsg:Byte Ptr, iLen:Int, iFlags:Int)
   Function closesocket:Int(iSocket:Int)
End Extern

Function MakeShort:Short(bA:Byte, bB:Byte)
   Return bA | (bB Shl 8)
End Function

Local tWSA:TWSAData
Local iSocket:Int
Local tAddress:TSockAddr_In
Local sMessage:String
Local tBuffer:TBank
Local iRecvSize:Int

If WSAStartup(MakeShort(1, 1), tWSA) Then
   Print "Fehler1"
   End
End If

iSocket = socket(AF_INET, SOCK_STREAM, 0)
If iSocket = -1 Then
   Print "Fehler2"
   End
End If

tAddress = New TSockAddr_In
tAddress.shSinFamily = AF_INET
tAddress.shSinPort   = htons(80)
tAddress.iSinAddr    = inet_addr("192.168.2.1".ToCString())

If connect(iSocket, tAddress, SizeOf(tAddress)) = -1 Then
   Print "Fehler3"
   Print WSAGetLastError()
   End
End If

sMessage = "GET http://192.168.2.1/ HTTP/1.0"+Chr(10)
Print "Bytes gesendet: "+send(iSocket, sMessage.ToCString(), Len(sMessage)+1, 0)
sMessage = Chr(10)
Print "Bytes gesendet: "send(iSocket, sMessage.ToCString(), Len(sMessage)+1, 0)

tBuffer = CreateBank(1024)
Repeat
   iRecvSize = recv(iSocket, BankBuf(tBuffer), 1024, 0)
   If iRecvSize = 0 Then Exit
   Print "Bytes empfangen: "+iRecvSize
Forever
   
Print "close"
Print closesocket(iSocket)


Dachte immer Sockets wären so ein Thema für sich, aber zumindest die Klientsoftware ist relativ leicht zu programmieren.

Werde mal morgen schauen, wie das ganze mit UDP geht.

mfg olli
vertex.dreamfall.at | GitHub

DivineDominion

BeitragFr, Jan 28, 2005 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Schmeiss dich besser mal an "Server" - soll heißen, versuch das select() umzusetzen, das sowohl auf Daten wartet als auch schreibt, bzw die Vorstufe dazu mit accept() für Server. Sieht gut aus bisher.
christian.tietze@gmail.com - https://christiantietze.de
macOS

Vertex

BeitragFr, Jan 28, 2005 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe mal jetzt eine Art Modul geschrieben...
Alle Funktionen beginnen mit einem s_ für "Socket" weil select ein BMax Schüsselwort ist.

Code: [AUSKLAPPEN]
Strict

Type TSockAddr
   Field shSinFamily:Short
   Field shSinPort:Short
   Field iSinAddr:Int
   Field bSinZero:Byte[8]
End Type

Type TFD_Set
   Field iFD_Count:Int
   Field iFD_Array:Int[64]
End Type

Type TTimeval
   Field iTV_Sec:Int  ' Seconds
   Field iTV_USec:Int ' Milliseconds
End Type


' Winsock only!
Type TWSAData
   Field shVersion:Short
   Field shHighVersion:Short
   Field bDescription:Byte[256+1]
   Field bSystemStatus:Byte[128+1]
   Field shMaxSockets:Short
   Field shMaxUdpDg:Short
   Field pbVendorInfo:Byte Ptr
End Type

Const IOCPARM_MASK              = $7F
Const IOC_VOID                  = $20000000
Const IOC_OUT                   = $40000000
Const IOC_IN                    = $80000000
Const IOC_INOUT                 = (IOC_IN | IOC_OUT)

Const IPPROTO_IP                = 0
Const IPPROTO_ICMP              = 1
Const IPPROTO_IGMP              = 2
Const IPPROTO_GGP               = 3
Const IPPROTO_TCP               = 6
Const IPPROTO_PUP               = 12
Const IPPROTO_UDP               = 17
Const IPPROTO_IDP               = 22
Const IPPROTO_ND                = 77
Const IPPROTO_RAW               = 255
Const IPPROTO_MAX               = 256
Const IPPORT_ECHO               = 7
Const IPPORT_DISCARD            = 9
Const IPPORT_SYSTAT             = 11
Const IPPORT_DAYTIME            = 13
Const IPPORT_NETSTAT            = 15
Const IPPORT_FTP                = 21
Const IPPORT_TELNET             = 23
Const IPPORT_SMTP               = 25
Const IPPORT_TIMESERVER         = 37
Const IPPORT_NAMESERVER         = 42
Const IPPORT_WHOIS              = 43
Const IPPORT_MTP                = 57
Const IPPORT_TFTP               = 69
Const IPPORT_RJE                = 77
Const IPPORT_FINGER             = 79
Const IPPORT_TTYLINK            = 87
Const IPPORT_SUPDUP             = 95
Const IPPORT_EXECSERVER         = 512
Const IPPORT_LOGINSERVER        = 513
Const IPPORT_CMDSERVER          = 514
Const IPPORT_EFSSERVER          = 520
Const IPPORT_BIFFUDP            = 512
Const IPPORT_WHOSERVER          = 513
Const IPPORT_ROUTESERVER        = 520
Const IPPORT_RESERVED           = 1024
Const IMPLINK_IP                = 155
Const IMPLINK_LOWEXPER          = 156
Const IMPLINK_HIGHEXPER         = 158

Const WSADESCRIPTION_LEN        = 256
Const WSASYS_STATUS_LEN         = 128

Const INADDR_ANY                 = 0
Const INADDR_LOOPBACK           = $7F000001
Const INADDR_BROADCAST           = $FFFFFFFF
Const INADDR_NONE                 = $FFFFFFFF
Const IP_OPTIONS                = 1
Const SO_DEBUG                  = 1
Const SO_ACCEPTCONN             = 2
Const SO_REUSEADDR              = 4
Const SO_KEEPALIVE              = 8
Const SO_DONTROUTE              = 16
Const SO_BROADCAST              = 32
Const SO_USELOOPBACK            = 64
Const SO_LINGER                 = 128
Const SO_OOBINLINE              = 256
Const SO_DONTLINGER             = ~SO_LINGER
Const SO_SNDBUF                 = $1001
Const SO_RCVBUF                 = $1002
Const SO_SNDLOWAT               = $1003
Const SO_RCVLOWAT               = $1004
Const SO_SNDTIMEO               = $1005
Const SO_RCVTIMEO               = $1006
Const SO_ERROR                  = $1007
Const SO_TYPE                   = $1008
     
Const IP_MULTICAST_IF           = 2
Const IP_MULTICAST_TTL          = 3
Const IP_MULTICAST_LOOP         = 4
Const IP_ADD_MEMBERSHIP         = 5
Const IP_DROP_MEMBERSHIP        = 6

Const IP_DEFAULT_MULTICAST_TTL  = 1
Const IP_DEFAULT_MULTICAST_LOOP = 1
Const IP_MAX_MEMBERSHIPS        = 20

Const INVALID_SOCKET            = (-1)
Const SOCKET_ERROR              = -1
Const SOCK_STREAM               = 1
Const SOCK_DGRAM                = 2
Const SOCK_RAW                  = 3
Const SOCK_RDM                  = 4
Const SOCK_SEQPACKET            = 5
Const TCP_NODELAY               = $0001
Const AF_UNSPEC                 = 0
Const AF_UNIX                   = 1
Const AF_INET                   = 2
Const AF_IMPLINK                = 3
Const AF_PUP                    = 4
Const AF_CHAOS                  = 5
Const AF_IPX                    = 6
Const AF_NS                     = 6
Const AF_ISO                    = 7
Const AF_OSI                    = AF_ISO
Const AF_ECMA                   = 8
Const AF_DATAKIT                = 9
Const AF_CCITT                  = 10
Const AF_SNA                    = 11
Const AF_DECnet                 = 12
Const AF_DLI                    = 13
Const AF_LAT                    = 14
Const AF_HYLINK                 = 15
Const AF_APPLETALK              = 16
Const AF_NETBIOS                = 17
Const AF_VOICEVIEW              = 18
Const AF_FIREFOX                = 19
Const AF_UNKNOWN1               = 20
Const AF_BAN                    = 21
Const AF_ATM                    = 22
Const AF_INET6                  = 23
Const AF_MAX                    = 24

Const PF_UNSPEC                 = AF_UNSPEC
Const PF_UNIX                   = AF_UNIX
Const PF_INET                   = AF_INET
Const PF_IMPLINK                = AF_IMPLINK
Const PF_PUP                    = AF_PUP
Const PF_CHAOS                  = AF_CHAOS
Const PF_NS                     = AF_NS
Const PF_IPX                    = AF_IPX
Const PF_ISO                    = AF_ISO
Const PF_OSI                    = AF_OSI
Const PF_ECMA                   = AF_ECMA
Const PF_DATAKIT                = AF_DATAKIT
Const PF_CCITT                  = AF_CCITT
Const PF_SNA                    = AF_SNA
Const PF_DECnet                 = AF_DECnet
Const PF_DLI                    = AF_DLI
Const PF_LAT                    = AF_LAT
Const PF_HYLINK                 = AF_HYLINK
Const PF_APPLETALK              = AF_APPLETALK
Const PF_VOICEVIEW              = AF_VOICEVIEW
Const PF_FIREFOX                = AF_FIREFOX
Const PF_UNKNOWN1               = AF_UNKNOWN1
Const PF_BAN                    = AF_BAN
Const PF_ATM                    = AF_ATM
Const PF_INET6                  = AF_INET6
Const PF_MAX                    = AF_MAX
Const SOL_SOCKET                = $FFFF
Const SOMAXCONN                 = 5

Const MSG_OOB                   = 1
Const MSG_PEEK                  = 2
Const MSG_DONTROUTE             = 4

Const MSG_MAXIOVLEN             = 16
Const MSG_PARTIAL               = $8000
Const MAXGETHOSTSTRUCT          = 1024
Const FD_READ                   = 1
Const FD_WRITE                  = 2
Const FD_OOB                    = 4
Const FD_ACCEPT                 = 8
Const FD_CONNECT                = 16
Const FD_CLOSE                  = 32

' Winsock only!
Const WSABASEERR                = 10000
Const WSAEINTR                  = (WSABASEERR+4)
Const WSAEBADF                  = (WSABASEERR+9)
Const WSAEACCES                 = (WSABASEERR+13)
Const WSAEFAULT                 = (WSABASEERR+14)
Const WSAEINVAL                 = (WSABASEERR+22)
Const WSAEMFILE                 = (WSABASEERR+24)
Const WSAEWOULDBLOCK            = (WSABASEERR+35)
Const WSAEINPROGRESS            = (WSABASEERR+36)
Const WSAEALREADY               = (WSABASEERR+37)
Const WSAENOTSOCK               = (WSABASEERR+38)
Const WSAEDESTADDRREQ           = (WSABASEERR+39)
Const WSAEMSGSIZE               = (WSABASEERR+40)
Const WSAEPROTOTYPE             = (WSABASEERR+41)
Const WSAENOPROTOOPT            = (WSABASEERR+42)
Const WSAEPROTONOSUPPORT        = (WSABASEERR+43)
Const WSAESOCKTNOSUPPORT        = (WSABASEERR+44)
Const WSAEOPNOTSUPP             = (WSABASEERR+45)
Const WSAEPFNOSUPPORT           = (WSABASEERR+46)
Const WSAEAFNOSUPPORT           = (WSABASEERR+47)
Const WSAEADDRINUSE             = (WSABASEERR+48)
Const WSAEADDRNOTAVAIL          = (WSABASEERR+49)
Const WSAENETDOWN               = (WSABASEERR+50)
Const WSAENETUNREACH            = (WSABASEERR+51)
Const WSAENETRESET              = (WSABASEERR+52)
Const WSAECONNABORTED           = (WSABASEERR+53)
Const WSAECONNRESET             = (WSABASEERR+54)
Const WSAENOBUFS                = (WSABASEERR+55)
Const WSAEISCONN                = (WSABASEERR+56)
Const WSAENOTCONN               = (WSABASEERR+57)
Const WSAESHUTDOWN              = (WSABASEERR+58)
Const WSAETOOMANYREFS           = (WSABASEERR+59)
Const WSAETIMEDOUT              = (WSABASEERR+60)
Const WSAECONNREFUSED           = (WSABASEERR+61)
Const WSAELOOP                  = (WSABASEERR+62)
Const WSAENAMETOOLONG           = (WSABASEERR+63)
Const WSAEHOSTDOWN              = (WSABASEERR+64)
Const WSAEHOSTUNREACH           = (WSABASEERR+65)
Const WSAENOTEMPTY              = (WSABASEERR+66)
Const WSAEPROCLIM               = (WSABASEERR+67)
Const WSAEUSERS                 = (WSABASEERR+68)
Const WSAEDQUOT                 = (WSABASEERR+69)
Const WSAESTALE                 = (WSABASEERR+70)
Const WSAEREMOTE                = (WSABASEERR+71)
Const WSAEDISCON                = (WSABASEERR+101)
Const WSASYSNOTREADY            = (WSABASEERR+91)
Const WSAVERNOTSUPPORTED        = (WSABASEERR+92)
Const WSANOTINITIALISED         = (WSABASEERR+93)
Const WSAHOST_NOT_FOUND         = (WSABASEERR+1001)
Const WSATRY_AGAIN              = (WSABASEERR+1002)
Const WSANO_RECOVERY            = (WSABASEERR+1003)
Const WSANO_DATA                = (WSABASEERR+1004)

Extern "Os"
   Function s_accept:Int(iSocket:Int, tAddr:Byte Ptr, iAddrLen:Int) = "accept@12"
   Function s_bind:Int(iSocket:Int, tName:Byte Ptr, iNameLen:Int) = "bind@12"
   Function s_closesocket:Int(iSocket:Int) = "closesocket@4"
   Function s_connect:Int(iSocket:Int, tName:Byte Ptr, iNameLen:Int) = "connect@12"
   Function s_getpeername:Int(iSocket:Int, tName:Byte Ptr, iNameLen:Int) = "getpeername@12"
   Function s_getsockname:Int(iSocket:Int, tName:Byte Ptr, iNameLen:Int) = "getsockname@12"
   Function s_getsockopt:Int(iSocket:Int, iLevel:Int, iOptname:Int, bpOptval:Byte Ptr, ipOptlen:Int Ptr) = "getsockopt@20"
   Function s_htonl:Int(iHost:Int) = "htonl@4"
   Function s_htons:Short(shHost:Short) = "htons@4"
   Function w_inet_addr:Int(sDottedIP:Byte Ptr) = "inet_addr@4"
   Function w_inet_ntoa:Byte Ptr(iAddr:Int) = "inet_ntoa@4"
   Function s_ioctlsocket:Int(iSocket:Int, iCmd:Int, pArqp:Byte Ptr) = "ioctlsocket@12"
   Function s_listen:Int(iSocket:Int, iBacklog:Int) = "listen@8"
   Function s_ntohl:Int(iNet:Int) = "ntohl@4"
   Function s_ntohs:Int(shNet:Short) = "ntohs@4"
   Function s_recv:Int(iSocket:Int, pBuf:Byte Ptr, iLen:Int, iFlags:Int) = "recv@16"
   Function s_recvfrom:Int(iSocket:Int, pBuf:Byte Ptr, iLen:Int, iFlags:Int, tFrom:Byte Ptr, ipFromLen:Int Ptr) = "recvfrom@24"
   Function s_select:Int(iNFDS:Int, tReadFds:Byte Ptr, tWriteFds:Byte Ptr, tExceptFds:Byte Ptr, tTimeout:Byte Ptr) = "select@20"
   Function s_send:Int(iSocket:Int, pBuf:Byte Ptr, iLen:Int, iFlags:Int) = "send@16"
   Function s_sendto:Int(iSocket:Int, pBuf:Byte Ptr, iLen:Int, iFlags:Int, tTo:Byte Ptr, iToLen:Int) = "sendto@24"
   Function s_setsockopt:Int(iSocket:Int, iLevel:Int, iOptname:Int, bpOptval:Byte Ptr, iOptlen:Int) = "setsockopt@20"
   Function s_shutdown:Int(iSocket:Int, iHow:Int) = "shutdown@4"
   Function s_socket:Int(iDomain:Int, iType:Int, iProtocol:Int) = "socket@12"

   Function w_gethostbyaddr:Byte Ptr(pAddr:Byte Ptr, iLen:Int, iType:Int) = "gethostbyaddr@12"
   Function w_gethostbyname:Byte Ptr(pName:Byte Ptr) = "gethostbyname@4"
   'Function w_gethostname:Int(pName:Byte Ptr, iNameLen:Int) = "gethostname@4"
   'Function w_getprotobynumber:Byte Ptr(iNumber:Int) = "getprotobynumber@4"
   'Function w_getprotobyname:Byte Ptr(pName:Byte Ptr, spProto:String Ptr = Null) = "getprotobyname@8"
   'Function w_getservbyport:Byte Ptr(iPort:Int, pProto:Byte Ptr) = "getservbyport@8"

    ' Winsock only!
   Function s_WSAStartup:Int(shVersion:Short, tWSA:Byte Ptr) = "WSAStartup@8"
   Function s_WSAGetLastError:Int() = "WSAGetLastError@0"
   Function s_WSACleanup:Int() = "WSACleanup@0"
   
   Function MemCopy2(dest:byte Ptr, src:Int, size:INt) = "bbMemCopy"
End Extern

Function MAKESHORT:Short(bA:Byte, bB:Byte)
   Return bA | (bB Shl 8)
End Function

Function MAKEINT:Int(shA:Short, shB:Short)
   Return shA | (shB Shl 16)
End Function

Function s_inet_addr:Int(sDottedIP:String)
   Return w_inet_addr(sDottedIP.ToCString())
End Function

Function s_inet_ntoa:String(iAddr:Int)
   Local sReturn:String, bpBuffer:Byte Ptr
   
   bpBuffer = w_inet_ntoa(iAddr)
   While True
      If Var bpBuffer = 0 Then Exit
      sReturn = sReturn+Chr(Var bpBuffer)
      bpBuffer = bpBuffer+1
   Wend
   
   Return sReturn
End Function

Function s_gethostbyname:Int(sURL:String)
   Local iIP:Int, tpHostent:Byte Ptr, tHostent:TBank, ipIP:Int Ptr
   
   If sURL = "" Then Return 0
   iIP = s_inet_addr(sURL)
   If iIP <> INADDR_NONE Then
      Return iIP
   Else
      tpHostent = w_gethostbyname(sURL.ToCString())
      If Not tpHostent Then Return 0
      tHostent = CreateBank(16)
      MemCopy(BankBuf(tHostent), tpHostent, 16)       ' tHostent = *tpHostent
      MemCopy2(Varptr ipIP, PeekInt(tHostent, 12), 4) ' iiIP = tHostent.piAddrList[]
      Release tHostent
      Return Var ipIP
   End If
End Function

Function s_gethostbyaddr:String(iAddr:Int)
   Local tpHostent:Byte Ptr, tHostent:TBank, bName:Byte[255], bIndex:Byte, sName:String
   
   If iAddr = 0 Then Return ""
   tpHostent = w_gethostbyaddr(Varptr iAddr, 4, PF_INET)
   If Not tpHostent Then Return 0
   tHostent = CreateBank(16)
   MemCopy(BankBuf(tHostent), tpHostent, 16)       ' tHostent = *tpHostent
   MemCopy2(bName, PeekInt(tHostent, 0), 4)
   bIndex = 0
   While True
      If bName[bIndex] = 0 Or bIndex > 255 Then Exit
      sName = sName+Chr(bName[bIndex])
      bIndex = bIndex+1
   Wend
   Release tHostent
   Return sName
End Function



Die ganzen anderen WSA Funktionen habe ich herausgelassen in der Hoffnung das irgendwie mal nach Linux oder gar MacOS zu portieren.

Hier nochmal das selbe Beispiel (ohne senden/empfangen) mit Fehleranalyse:
Code: [AUSKLAPPEN]
Local tWSA:TWSAData
Local iSocket:Int
Local tAddress:TSockAddr

Print "Starten von Winsock..."
If s_WSAStartup(MAKESHORT(2, 0), tWSA) Then
   Print "Fehler: "+s_WSAGetlastError()
   
   ' WSASYSNOTREADY
   ' (WSAVERNOTSUPPORTED)
   ' WSAEINVAL
   
   Print "Winsock beenden..."
   If s_WSACleanup() = SOCKET_ERROR Then
      Print "Fehler: "+s_WSAGetlastError()
   Else
      Print "OK"
   End If
   
   End
Else
   Print "OK"
End If

Print "Socket erstellen..."
iSocket = s_socket(AF_INET, SOCK_STREAM, 0)
If iSocket = INVALID_SOCKET Then
   Print "Fehler: "+s_WSAGetlastError()
   
   ' WSANOTINITIALISED
   ' WSAENETDOWN
   ' WSAEAFNOSUPPORT
   ' WSAEINPROGRESS
   ' WSAEMFILE
   ' WSAENOBUFS
   ' WSAEPROTONOSUPPORT
   ' WSAEPROTOTYPE
   ' WSAESOCKTNOSUPPORT
   
   End
Else
   Print "OK"
End If

Print "Verbinden zum Server 192.168.2.1"
tAddress = New TSockAddr
tAddress.shSinFamily = AF_INET
tAddress.shSinPort   = s_htons(80)
tAddress.iSinAddr    = s_inet_addr("192.168.2.1")
If s_connect(iSocket, tAddress, 16) = SOCKET_ERROR Then
   Print "Fehler: "+s_WSAGetlastError()
   
   ' WSANOTINITIALISED
   ' WSAENETDOWN
   ' WSAEADDRINUSE
   ' WSAEINTR
   ' WSAEINPROGRESS
   ' WSAEADDRNOTAVAIL
   ' WSAEAFNOSUPPORT
   ' WSAECONNREFUSED
   ' WSAEDESTADDREQ
   ' WSAEFAULT
   ' WSAEINVAL
   ' WSAEISCONN
   ' WSAEMFILE
   ' WSAENETUNREACH
   ' WSAENOBUFS
   ' WSAENOTSOCK
   ' WSAETIMEDOUT
   ' WSAEWOULDBLOCK
   
   Print "Socket schließen..."
   If s_closesocket(iSocket) = SOCKET_ERROR Then
      Print "Fehler: "+s_WSAGetlastError()
   Else
      Print "OK"
   End If
   
   Print "Winsock beenden..."
   If s_WSACleanup() = SOCKET_ERROR Then
      Print "Fehler: "+s_WSAGetlastError()
   Else
      Print "OK"
   End If
   
   End
Else
   Print "OK"
End If

Print "Socket schließen..."
If s_closesocket(iSocket) = SOCKET_ERROR Then
   Print "Fehler: "+s_WSAGetlastError()
   
   ' WSANOTINITIALISED
   ' WSAENETDOWN
   ' WSAENOTSOCK
   ' WSAEINPROGRESS
   ' WSAEINTR
   ' WSAEWOULDBLOCK
   
   End
Else
   Print "OK"
End If

Print "Winsock beenden..."
If s_WSACleanup() = SOCKET_ERROR Then
   Print "Fehler: "+s_WSAGetlastError()
   
   ' WSANOTINITIALISED
   ' WSAENETDOWN
   ' WSAEINPROGRESS
   
   End
Else
   Print "OK"
End If


Wenn ich meine Firewall z. B. aktiviert habe, kommt beim Connect ein 1061 Fehler(WSACONNREFUSED), deaktiviert geht alles.

Divi:
Werde ich jetzt mal ausprobieren, aber ersteinmal mit accept und dann mit select. So wie ich da sverstanden habe, gibt mir select eine Liste aller Klienten zurück, wo gelesen, geschrieben und irgendwie etwas passiert wird. Die jeweilige Anzahl an Klienten müsste dann in iFD_Count stehen.

Ist dann in iFD_Array[] das Socket gespeichert?

mfg olli

Edit: Habe das gnaze nochmal etwas überarbeitet, ist noch beta.
Es geht jetzt z. B. Print s_inet_ntoa(s_gethostbyname("blitzforum.de")) das dann die IP von blitzforum.de zurückliefert. Bei s_gethostbyaddr habe ich noch keine Ahnugn, warum das mit "wp00" zurückgegeben wird.
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group