UDP Server und Client
Übersicht

![]() |
VertexBetreff: UDP Server und Client |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group