Wer mag Sockets? stdc.mod, socketstream.mod
Übersicht BlitzMax, BlitzMax NG Allgemein
DivineDominionBetreff: Wer mag Sockets? stdc.mod, socketstream.mod |
So, Jan 23, 2005 2:00 Antworten mit Zitat |
|
---|---|---|
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 |
So, Jan 23, 2005 17:41 Antworten mit Zitat |
|
---|---|---|
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 | ||
bruZard |
Mi, Jan 26, 2005 11:23 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Jan 26, 2005 14:48 Antworten mit Zitat |
|
---|---|---|
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 |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
Vertex |
Do, Jan 27, 2005 22:36 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Jan 28, 2005 0:46 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Jan 28, 2005 15:10 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Jan 28, 2005 17:18 Antworten mit Zitat |
|
---|---|---|
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 |
Übersicht BlitzMax, BlitzMax NG Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group