/*@!Encoding:1252*/ includes { #include "Common.cin" #include "TcpUdpCommon.cin" } variables { UdpSocket g_%NODE_NAME%_Socket; byte gRxBuffer[8192]; } word UdpOpenSocket() { char Local_IP[16]; dword localIp; word localPort; dword i = 0; CHAR errorText[200]; localIp = SetupIp(Local_IP); localPort = random(65535-10240)+10240; if (localIp == INVALID_IP) return INVALID_IP; // Try to open socket do { g_%NODE_NAME%_Socket = UdpSocket::Open(localIp, localPort); if (g_%NODE_NAME%_Socket.GetLastSocketError() != 0) { g_%NODE_NAME%_Socket.GetLastSocketErrorAsString(errorText, elcount(errorText)); writeLineEx(0, 1, "<%BASE_FILE_NAME%> Error: could not open Udp socket on %s:%d, %s (%d)!", Local_IP, localPort, errorText, g_%NODE_NAME%_Socket.GetLastSocketError()); } } while (g_%NODE_NAME%_Socket.GetLastSocketError() != 0 && i++ < 9); if (g_%NODE_NAME%_Socket.GetLastSocketError() != 0) { writeLineEx(0, 1, "<%BASE_FILE_NAME%> Error: could not open Udp socket!"); return g_%NODE_NAME%_Socket.GetLastSocketError(); } else { writeLineEx(0, 1, "<%BASE_FILE_NAME%> Udp socket opened on %s:%d.", Local_IP, localPort); } return 0; } word UdpConnectTo(char Remote_IP[], word remotePort) { dword remoteIp; // Convert IP string to Number remoteIp = IpGetAddressAsNumber(Remote_IP); if (remoteIp == INVALID_IP) { writeLineEx(0, 1, "<%BASE_FILE_NAME%> Error: invalid server Ip address!"); return 1; } return UdpConnectTo(remoteIp, remotePort); } word UdpConnectTo(dword remoteIp, word remotePort) { long fehler; // Try to open a socket fehler = UdpOpenSocket(); if (fehler != 0) { g_%NODE_NAME%_SocketState = ERROR; return fehler; } g_%NODE_NAME%_RemoteIP = remoteIp; g_%NODE_NAME%_RemotePort = remotePort; g_%NODE_NAME%_SocketState = OK; return 0; } void UdpRecv() { int result; if (g_%NODE_NAME%_SocketState != OK) { writeLineEx(0, 2, "UdpRecv: Socket status is not OK!"); return; } result = g_%NODE_NAME%_Socket.ReceiveFrom(gRxBuffer, elcount(gRxBuffer)); if (result != 0) // Calling OnUdpReceive otherwise { gIpLastErr = g_%NODE_NAME%_Socket.GetLastSocketError(); if (gIpLastErr != WSA_IO_PENDING) // Calling OnUdpReceive otherwise { g_%NODE_NAME%_Socket.GetLastSocketErrorAsString(gIpLastErrStr, elcount(gIpLastErrStr)); writeLineEx(0, 2, "<%BASE_FILE_NAME%> UdpRecv Error (%d): %s", gIpLastErr, gIpLastErrStr); g_%NODE_NAME%_Socket.Close(); g_%NODE_NAME%_SocketState = CLOSED; } } return; } void UdpSnd(byte buffer[]) { char str[20*3]; switch (g_%NODE_NAME%_SocketState) { case CLOSED: UdpConnectTo(g_%NODE_NAME%_RemoteIP, g_%NODE_NAME%_RemotePort); if (g_%NODE_NAME%_SocketState != OK) { writeLineEx(0, 2, "UdpSnd: Reconnecting failed!"); return; } case OK: break; default: writeLineEx(0, 2, "UdpSnd: Socket status is not OK!"); return; } bin_to_strhex(buffer, str); writeLineEx(0, 1, "<%BASE_FILE_NAME%> UdpSnd: %s (Länge: %d)", str, elCount(buffer)); if (g_%NODE_NAME%_Socket.SendTo(g_%NODE_NAME%_RemoteIP, g_%NODE_NAME%_RemotePort, buffer, elCount(buffer)) != 0) { gIpLastErr = g_%NODE_NAME%_Socket.GetLastSocketError(); if (gIpLastErr != WSA_IO_PENDING) { g_%NODE_NAME%_Socket.GetLastSocketErrorAsString(gIpLastErrStr, elcount(gIpLastErrStr)); writeLineEx(0, 2, "<%BASE_FILE_NAME%> UdpSnd error (%d): %s", gIpLastErr, gIpLastErrStr); g_%NODE_NAME%_Socket.Close(); g_%NODE_NAME%_SocketState = CLOSED; } } }