UDP Server und Client

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Vertex

Betreff: UDP Server und Client

BeitragMo, Jan 31, 2005 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Unter http://www.c-worker.ch/tuts.html findet ihr die Tutorials.
Unter http://blitzbasic.com/codearcs...?code=1270 gibt es meine Socketlib (genannt socket.bmx)

Server:
Code: [AUSKLAPPEN]
Strict

Import "Socket.bmx"

Local tWSA        : TWSAData
Local iSocket     : Int
Local tAddr       : TSockAddr
Local tAddrRemote : TSockAddr
Local iRemoteLen  : Int
Local tBuffer     : TBank
Local sMessage    : String
Local iResult     : Int

Print "UDP Server"
Print ""

tWSA = New TWSAData
Print "Starting Winsock..."
If s_WSAStartup(MAKESHORT(2, 0), tWSA) <> 0 Then
   Print " Error: "+s_WSAGetLastError()
Else
   Print " OK ( "+tWSA.sDescription+" \ "+tWSA.sSystemStatus+" )"
   Print ""
EndIf

Print "Creating UDP-Socket..."
iSocket = s_socket(AF_INET, SOCK_DGRAM, 0)
If iSocket = INVALID_SOCKET Then
   Print " Error: "+s_WSAGetLastError()
Else
   Print " OK"
   Print ""
EndIf

tAddr = New TSockAddr
tAddr.shSinFamily = AF_INET
tAddr.shSinPort   = s_htons(1234)
tAddr.iSinAddr    = INADDR_ANY

Print "Binding socket on port 1234..."
iResult = s_bind(iSocket, tAddr, 16)
If iResult = SOCKET_ERROR Then
   Print " Error: "+s_WSAGetLastError()
Else
   Print " OK"
   Print ""
EndIf

tAddrRemote = New TSockAddr
iRemoteLen  = 16
tBuffer     = CreateBank(256)

While True
   Print "Waiting For incomming data..."
   iResult = s_recvfrom(iSocket, BankBuf(tBuffer), 256, 0, tAddrRemote, Varptr iRemoteLen)
   If iResult = SOCKET_ERROR Then
      Print " Error: "+s_WSAGetLastError()
      Print ""
   Else
      Print " OK ( "+iResult+" Bytes received )"
      Print " Sender:"
      Print "  Port: "+s_ntohs(tAddrRemote.shSinPort)
      Print "  IP: "+s_inet_ntoa(tAddrRemote.iSinAddr)
      Print "  Message: "+"".FromCString(BankBuf(tBuffer))
      Print ""
   EndIf

   Print " Sending message..."
   sMessage = "I have received: "+"".FromCString(BankBuf(tBuffer))
   iResult = s_sendto(iSocket, sMessage.ToCString(), Len(sMessage)+1, 0, tAddrRemote, 16)
   If iResult = SOCKET_ERROR Then
      Print " Error: "+s_WSAGetLastError()
      Print ""
   Else
      Print " OK ( "+iResult+" Bytes sended )"
      Print ""
   EndIf
Wend

Print "Closing socket..."
If s_closesocket(iSocket) = SOCKET_ERROR Then
   Print " Error: "+s_WSAGetLastError()
   Print ""
Else
   Print " OK"
   Print ""
EndIf

Print "Closing Winsock..."
If s_WSACleanup() = SOCKET_ERROR Then
   Print " Error: "+s_WSAGetLastError()
   Print ""
Else
   Print " OK"
   Print ""
EndIf

Print "Good bye!"
Delay 1000
End



Client:
Code: [AUSKLAPPEN]
Strict

Import "Socket.bmx"

Local tWSA        : TWSAData
Local iSocket     : Int
Local tAddr       : TSockAddr
Local tAddrRemote : TSockAddr
Local iRemoteLen  : Int
Local tBuffer     : TBank
Local sMessage    : String
Local iResult     : Int

Print "UDP Client"
Print ""

tWSA = New TWSAData
Print "Starting Winsock..."
If s_WSAStartup(MAKESHORT(2, 0), tWSA) <> 0 Then
   Print " Error: "+s_WSAGetLastError()
Else
   Print " OK ( "+tWSA.sDescription+" \ "+tWSA.sSystemStatus+" )"
   Print ""
EndIf

Print "Creating UDP-Socket..."
iSocket = s_socket(AF_INET, SOCK_DGRAM, 0)
If iSocket = INVALID_SOCKET Then
   Print " Error: "+s_WSAGetLastError()
Else
   Print " OK"
   Print ""
EndIf

tAddr = New TSockAddr
tAddr.shSinFamily = AF_INET
tAddr.shSinPort   = s_htons(1234)
tAddr.iSinAddr    = s_inet_addr("127.0.0.1")

tAddrRemote = New TSockAddr
iRemoteLen  = 16
tBuffer     = CreateBank(256)

While True
   sMessage = Input("Message: ")
   If sMessage = "quit" Then Exit
   
   Print " Sending message..."
   iResult = s_sendto(iSocket, sMessage.ToCString(), Len(sMessage)+1, 0, tAddr, 16)
   If iResult = SOCKET_ERROR Then
      Print " Error: "+s_WSAGetLastError()
      Print ""
   Else
      Print " OK ( "+iResult+" Bytes sended )"
      Print ""
   EndIf
   
   Print "Waiting For incomming data..."
   iResult = s_recvfrom(iSocket, BankBuf(tBuffer), 256, 0, tAddrRemote, Varptr iRemoteLen)
   If iResult = SOCKET_ERROR Then
      Print " Error: "+s_WSAGetLastError()
      Print ""
   Else
      Print " OK ( "+iResult+" Bytes received )"
      Print " Sender:"
      Print "  Port: "+s_ntohs(tAddrRemote.shSinPort)
      Print "  IP: "+s_inet_ntoa(tAddrRemote.iSinAddr)
      Print "  Message: "+"".FromCString(BankBuf(tBuffer))
      Print ""
   EndIf
Wend

Print "Closing socket..."
If s_closesocket(iSocket) = SOCKET_ERROR Then
   Print " Error: "+s_WSAGetLastError()
   Print ""
Else
   Print " OK"
   Print ""
EndIf

Print "Closing Winsock..."
If s_WSACleanup() = SOCKET_ERROR Then
   Print " Error: "+s_WSAGetLastError()
   Print ""
Else
   Print " OK"
   Print ""
EndIf

Print "Good bye!"
Delay 1000
End


Problem ist eben das BlockingCall wobei das Programm angehalten wird, bis Daten empfangen wurden bei s_recv bzw. s_recvfrom. Das will ich demnächst mit select unterbinden.

Event. könnte man schon auf Basis dessen ein UDP-Moduk zusammenstellen das wie in BlitzBASIC arbeitet.

mfg olli
vertex.dreamfall.at | GitHub

Vertex

BeitragMo, Jan 31, 2005 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal hier noch den passenden BlitzClassic Client geschrieben:
Code: [AUSKLAPPEN]
Global iAddr = INT_IP("127.0.0.1")
Global iSocket
Global tBuffer
Global sMessage$
Global iResult
Global iRemoteIP

Print "UDP Client"
Print ""

Print "Creating UDP-Socket..."
iSocket = CreateUDPStream()

If iSocket = 0 Then
   Print " Error"
Else
   Print " OK"
   Print ""
EndIf

tBuffer = CreateBank(256)

While True
   sMessage$ = Input$("Message: ")
   If sMessage$ = "quit" Then Exit
   
   
   Print " Sending message..."
   ToCString(tBuffer, sMessage$)
   iResult = WriteBytes(tBuffer, iSocket, 0, Len(sMessage$)+1)
   SendUDPMsg iSocket, iAddr, 1234
   If iResult = 0 Then
      Print " Error "
      Print ""
   Else
      Print " OK ( "+iResult+" Bytes sended )"
      Print ""
   EndIf
   
   Print " Waiting for incomming data..."
   Repeat
      iRemoteIP = RecvUDPMsg(iSocket)
      If iRemoteIP <> 0 Then
         iResult = ReadAvail(iSocket)
      Else
         iResult = 0
      EndIf
   Until iResult > 0
   iResult = ReadBytes(tBuffer, iSocket, 0, iResult)
   Print " OK ("+iResult+" Bytes received )"
   Print " Sender:"
   Print "  Port: "+UDPMsgPort(iSocket)
   Print "  IP: "+DottedIP$(UDPMsgIP(iSocket))
   Print "  Message: "+FromCString$(tBuffer)
   Print ""
Wend

Function ToCString(tBank, sString$)
   Local iLen, iIndex
   
   iLen = Len(sString$)
   For iIndex = 0 To iLen-1
      PokeByte tBank, iIndex, Asc(Mid$(sString$, iIndex+1, 1))
   Next
   PokeByte tBank, iLen, 0
End Function

Function FromCString$(tBank)
   Local iLen, iIndex, iChar, sString$
   
   iLen = BankSize(tBank)
   For iIndex = 0 To iLen-1
      iChar = PeekByte(tBank, iIndex)
      If iChar = 0 Then Exit
      sString$ = sString$+Chr$(iChar)
   Next
   
   Return sString$
End Function

Function INT_IP(IP$)
   a1=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   a2=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   a3=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   a4=Int(IP$)
   Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) +a4
End Function


Der Server in BlitzClassic wird noch folgen.

mfg olli
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group