From: <sv...@ww...> - 2004-05-10 04:35:51
|
Author: wolverine Date: 2004-05-02 13:12:35 -0700 (Sun, 02 May 2004) New Revision: 939 Added: trunk/CSP/CSPSim/Source/ClientNode.cpp trunk/CSP/CSPSim/Source/Networking/MessageSocketDuplex.cpp trunk/CSP/CSPSim/Source/ServerNode.cpp Log: Added new Networking files Added: trunk/CSP/CSPSim/Source/ClientNode.cpp =================================================================== --- trunk/CSP/CSPSim/Source/ClientNode.cpp 2004-05-02 20:11:00 UTC (rev 938) +++ trunk/CSP/CSPSim/Source/ClientNode.cpp 2004-05-02 20:12:35 UTC (rev 939) @@ -0,0 +1,42 @@ + + +#include "ClientNode.h" + +#include <cc++/common.h> +#include "Networking.h" +#include <stdio.h> +#include <stdlib.h> + +ClientNode::ClientNode() +{ + +} + +int ClientNode::run() +{ + printf("Network test client starting up...\n"); + Port clientPort = 20010; + Port serverPort = 20011; + MessageSocketDuplex * socketDuplex = new MessageSocketDuplex(clientPort); + NetworkMessage message; + message.initialize(1, 100); + char * payloadPtr = (char*)message.getPayloadPtr(); + memset(payloadPtr, 0 , 100); + strcpy(payloadPtr, "Hello From CSP Network Test Client!"); + ost::InetHostAddress * serverAddress = new ost::InetHostAddress("localhost"); + socketDuplex->sendto(message, serverAddress, &serverPort); + + return 0; +} + +#ifdef CSP_STANDALONE + +int main(int argc, char * argv[]) +{ + ClientNode node; + return node.run(); +} + +#endif + + Added: trunk/CSP/CSPSim/Source/Networking/MessageSocketDuplex.cpp =================================================================== --- trunk/CSP/CSPSim/Source/Networking/MessageSocketDuplex.cpp 2004-05-02 20:11:00 UTC (rev 938) +++ trunk/CSP/CSPSim/Source/Networking/MessageSocketDuplex.cpp 2004-05-02 20:12:35 UTC (rev 939) @@ -0,0 +1,156 @@ +// Combat Simulator Project - FlightSim Dem +// Copyright (C) 2002 The Combat Simulator Project +// http://csp.sourceforge.net +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +/** + * @file NetworkSocket.cpp: + * @author Scott Flicker (Wolverine) + */ +#if _MSC_VER +#include <WinSock2.h> +#endif + +#include "Networking.h" + +MessageSocketDuplex::MessageSocketDuplex() +{ + m_UDPReceiverSocket = new ost::UDPSocket(); + m_UDPSenderSocket = new ost::UDPSocket(); + m_receiverAddr = NULL; + m_receiverPort = 0; +} + +MessageSocketDuplex::MessageSocketDuplex(Port port) +{ + // create receiver end point + m_receiverAddr = new ost::InetAddress(); // this should be to INADDR_ANY + m_receiverPort = port; + m_UDPReceiverSocket = new ost::UDPSocket(*m_receiverAddr, port); + m_UDPSenderSocket = new ost::UDPSocket(); + + /* + m_receiverSockFd = socket(AF_INET, SOCK_DGRAM, 0); + m_senderSockFd = socket(AF_INET, SOCK_DGRAM, 0); + */ + + /* + memset( (void*)&m_receiverSocketAddress, 0, sizeof (struct sockaddr_in)); + + m_receiverSocketAddress.sin_family = AF_INET; + m_receiverSocketAddress.sin_port = htons( port ); + m_receiverSocketAddress.sin_addr.s_addr = htonl(INADDR_ANY); + + ::bind(m_receiverSockFd, (struct sockaddr *)&m_receiverSocketAddress, sizeof(m_receiverSocketAddress)); + */ + + // create sender end point + + +} + +MessageSocketDuplex::MessageSocketDuplex(ost::InetAddress & addr, Port port) +{ + m_receiverAddr = &addr; + m_receiverPort = port; + m_UDPReceiverSocket = new ost::UDPSocket(addr, port); + m_UDPSenderSocket = new ost::UDPSocket(); + +} + +/* +void MessageSocketDuplex::bind(NetworkAddress * address, Port port) +{ + +} +*/ + +int MessageSocketDuplex::sendto(NetworkMessage & message, ost::InetHostAddress * remoteAddress, Port * remotePort) +{ + printf("Sending Network Packet\n"); + + m_UDPSenderSocket->setPeer(*remoteAddress, *remotePort); + +#ifdef _MSC_VER + return m_UDPSenderSocket->send((const char *)message.getBufferPtr(), message.getBufferLen()); +#else + return m_UDPSenderSocket->send((const void *)message.getBufferPtr(), message.getBufferLen()); +#endif + + /* + + struct sockaddr_in servaddr; + memset((void*)&servaddr, 0, sizeof(sockaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(*remotePort); + servaddr.sin_addr.s_addr = inet_addr(remoteAddress->getNetworkName().c_str()); + +#ifdef _MSC_VER + return ::sendto(m_senderSockFd, (const char *)message->getBufferPtr(), message->getBufferLen(), 0, (const struct sockaddr *)&servaddr, sizeof(sockaddr)); +#else + return ::sendto(m_senderSockFd, (const void *)message->getBufferPtr(), message->getBufferLen(), 0, (const struct sockaddr *)&servaddr, sizeof(sockaddr)); +#endif + + */ + +} + +int MessageSocketDuplex::recvfrom(NetworkMessage & message, ost::InetHostAddress * remoteAddress, Port * remotePort) +{ + printf("Receving Network Packet\n"); + + if (m_UDPReceiverSocket->isPending(ost::Socket::pendingInput, 0)) + { + // get addr of next packet + Port port; + ost::InetHostAddress addr = m_UDPReceiverSocket->getPeer(&port); + + + // TODO may need to validate addr, and port as being from a register node. + if (remotePort) + *remotePort = port; + if (remoteAddress) + *remoteAddress = addr; + + // peek at packet to verify this is a valid CSP packet. and if so get the packet type. + + int headerlen = 6; + uint16 headerBuffer[headerlen]; + int numHeaderBytes = m_UDPReceiverSocket->peek(headerBuffer, headerlen); + + // TODO validation of header + + // get the packet + int numPacketBytes = m_UDPReceiverSocket->receive((void*)message.getBufferPtr(), + message.getBufferLen()); + + return numPacketBytes; + + } + return 0; + + + + /* + struct sockaddr_in cliaddr; + socklen_t clilen = sizeof(cliaddr); + return ::recvfrom(m_receiverSockFd, (void *)message->getBufferPtr(), message->getBufferLen(), + 0, (struct sockaddr *)&cliaddr, &clilen); + */ + +} + Added: trunk/CSP/CSPSim/Source/ServerNode.cpp =================================================================== --- trunk/CSP/CSPSim/Source/ServerNode.cpp 2004-05-02 20:11:00 UTC (rev 938) +++ trunk/CSP/CSPSim/Source/ServerNode.cpp 2004-05-02 20:12:35 UTC (rev 939) @@ -0,0 +1,45 @@ +#include "Networking.h" +#include "ServerNode.h" +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +ServerNode::ServerNode() +{ + +} + +int ServerNode::run() +{ + printf("Network test client starting up...\n"); + Port clientPort = 20010; + Port serverPort = 20011; + MessageSocketDuplex * socket = new MessageSocketDuplex(serverPort); + NetworkMessage message; + message.initialize(1, 100); + memset((void*)message.getPayloadPtr(), 0, 100); + while(1) + { + int numreceived = socket->recvfrom(message, NULL, &clientPort); + char * payloadPtr = (char*)message.getPayloadPtr(); + printf("Received Mesage From Client: %s\n", payloadPtr); + memset((void*)message.getPayloadPtr(), 0, 100); + if (numreceived == 0) + { + ::sleep(5); + } + } + + return 0; +} + +#ifdef CSP_STANDALONE + +int main(int argc, char * argv[]) +{ + ServerNode node; + return node.run(); +} + +#endif + |