forked from Mirrors/openclonk
283 lines
5.9 KiB
C++
283 lines
5.9 KiB
C++
/*
|
|
* OpenClonk, http://www.openclonk.org
|
|
*
|
|
* Copyright (c) 2005-2006, Peter Wortmann
|
|
* Copyright (c) 2005, Günther Brammer
|
|
* Copyright (c) 2009-2016, The OpenClonk Team and contributors
|
|
*
|
|
* Distributed under the terms of the ISC license; see accompanying file
|
|
* "COPYING" for details.
|
|
*
|
|
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
|
|
* See accompanying file "TRADEMARK" for details.
|
|
*
|
|
* To redistribute this file separately, substitute the full license texts
|
|
* for the above references.
|
|
*/
|
|
|
|
#include "C4Include.h"
|
|
#include "network/C4NetIO.h"
|
|
#include "lib/C4Random.h"
|
|
|
|
#ifdef _WIN32
|
|
#include "platform/C4windowswrapper.h"
|
|
#include <mmsystem.h>
|
|
#else
|
|
#include <arpa/inet.h>
|
|
#endif
|
|
|
|
using namespace std;
|
|
|
|
bool fHost;
|
|
int iCnt = 0, iSize = 0;
|
|
char DummyData[1024 * 1024];
|
|
|
|
#define ASYNC_CONNECT
|
|
|
|
// TCP otherwise
|
|
#define USE_UDP
|
|
|
|
class MyCBClass : public C4NetIOMan
|
|
{
|
|
unsigned int tTime, iPcks;
|
|
public:
|
|
virtual bool OnConn(const C4NetIO::addr_t &addr, const C4NetIO::addr_t &addr2, C4NetIO *pNetIO)
|
|
{
|
|
cout << "got connection from " << inet_ntoa(addr.sin_addr) << endl;
|
|
tTime = C4TimeMilliseconds::Now();
|
|
iPcks = 0;
|
|
|
|
#ifdef ASYNC_CONNECT
|
|
if (!fHost)
|
|
{
|
|
DummyData[0] = 0;
|
|
if (!pNetIO->Send(C4NetIOPacket(DummyData, iSize, true, addr)))
|
|
cout << " Fehler: " << (pNetIO->GetError() ? pNetIO->GetError() : "bla") << endl;
|
|
}
|
|
#endif
|
|
return true;
|
|
}
|
|
virtual void OnPacket(const class C4NetIOPacket &rPacket, C4NetIO *pNetIO)
|
|
{
|
|
C4TimeMilliseconds tNow = C4TimeMilliseconds::Now();
|
|
if (tNow > tTime + 1000)
|
|
{
|
|
cout << iPcks << " packets in " << tNow - tTime << " ms (" << iPcks * 1000 / (tNow - tTime) << " per second, " << (iPcks ? (tNow - tTime) * 1000 / iPcks : -1u) << "us per packet)" << endl;
|
|
tTime = C4TimeMilliseconds::Now();
|
|
iPcks = 0;
|
|
}
|
|
if (!rPacket.getStatus())
|
|
{
|
|
// dummys
|
|
DummyData[0] = 1;
|
|
C4NetIOPacket Dummy(DummyData, iSize, true, rPacket.getAddr());
|
|
for (int i = 0; i < iCnt; i++)
|
|
{
|
|
if (!pNetIO->Send(Dummy))
|
|
cout << " Fehler: " << (pNetIO->GetError() ? pNetIO->GetError() : "bla") << endl;
|
|
}
|
|
// pong
|
|
pNetIO->Send(rPacket);
|
|
iPcks++;
|
|
}
|
|
// cout << "got " << rPacket.GetSize() << " bytes of data (" << int(*rPacket.GetData()) << ")" << endl;
|
|
}
|
|
virtual void OnDisconn(const C4NetIO::addr_t &addr, C4NetIO *pNetIO, const char *szReason)
|
|
{
|
|
cout << "client from " << inet_ntoa(addr.sin_addr) << " disconnected (" << szReason << ")" << endl;
|
|
}
|
|
virtual void OnError(const char *strError, C4NetIO *pNetIO)
|
|
{
|
|
cout << "network error: " << strError << endl;
|
|
};
|
|
};
|
|
|
|
int main(int argc, char * argv[])
|
|
{
|
|
|
|
int i;
|
|
for (i = 0; i < sizeof(DummyData); i++)
|
|
DummyData[i] = 'A' + i % 100;
|
|
|
|
FixedRandom(time(nullptr));
|
|
|
|
#ifdef USE_UDP
|
|
C4NetIOUDP NetIO;
|
|
#else
|
|
C4NetIOTCP NetIO;
|
|
#endif
|
|
|
|
C4NetIO *pNetIO = &NetIO;
|
|
MyCBClass CBClass;
|
|
CBClass.AddIO(pNetIO);
|
|
|
|
#ifdef HAVE_WINSOCK
|
|
WSADATA wsaData;
|
|
|
|
WSAStartup(0x0202, &wsaData);
|
|
#endif
|
|
|
|
C4NetIO::addr_t addr;
|
|
// Default
|
|
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
|
|
addr.sin_port = htons(11111);
|
|
addr.sin_family = AF_INET;
|
|
short iPort = 0;
|
|
|
|
for (i = 1; i < argc; ++i)
|
|
{
|
|
std::string arg(argv[i]);
|
|
int n;
|
|
if (arg == "--server")
|
|
{
|
|
fHost = true;
|
|
if (!iPort) iPort = 11111;
|
|
}
|
|
else if ((n = arg.find("--port=")) != -1)
|
|
{
|
|
std::istringstream stream(std::string(arg.begin() + n + sizeof("--port="), arg.end()));
|
|
stream >> iPort;
|
|
}
|
|
else if ((n = arg.find("--size=")) != -1)
|
|
{
|
|
std::istringstream stream(std::string(arg.begin() + n + sizeof("--size="), arg.end()));
|
|
stream >> iSize;
|
|
}
|
|
else
|
|
{
|
|
if (!ResolveAddress(argv[i], &addr, 11111)) cout << "Fehler in ResolveAddress(" << argv[i] << ")" << std::endl;
|
|
if (!iPort) iPort = 11112;
|
|
}
|
|
}
|
|
if (argc == 1)
|
|
{
|
|
#ifndef _WIN32
|
|
cout << "Possible usage: " << argv[0] << " [--server] [address[:port]] --port=port --size=size" << std::endl << std::endl;
|
|
#endif
|
|
|
|
cout << "Server? (j/n)";
|
|
char cChoice;
|
|
do
|
|
cin >> cChoice;
|
|
while (tolower(cChoice) != 'n' && tolower(cChoice) != 'j');
|
|
|
|
fHost = (tolower(cChoice) == 'j');
|
|
|
|
if (cChoice == 'J' || cChoice == 'N')
|
|
{
|
|
iPort = (cChoice == 'J' ? 11111 : 11112);
|
|
iCnt = 0;
|
|
iSize = 0;
|
|
}
|
|
else
|
|
{
|
|
cout << "Port?";
|
|
cin >> iPort;
|
|
|
|
cout << "Dummys?";
|
|
do
|
|
cin >> iCnt;
|
|
while (iCnt < 0);
|
|
|
|
cout << "Größe?";
|
|
do
|
|
cin >> iSize;
|
|
while (iSize < 1 || iSize > 1024);
|
|
}
|
|
if (!fHost)
|
|
{
|
|
char szAddr[1024];
|
|
int iDPort;
|
|
if (cChoice == 'N')
|
|
{
|
|
strcpy(szAddr, "127.0.0.1");
|
|
iDPort = 11111;
|
|
}
|
|
else
|
|
{
|
|
cout << "Wohin (Adresse)? ";
|
|
cin >> szAddr;
|
|
|
|
cout << "Wohin (Port)? ";
|
|
cin >> iDPort;
|
|
}
|
|
addr.sin_addr.s_addr = inet_addr(szAddr);
|
|
addr.sin_port = htons(iDPort);
|
|
addr.sin_family = AF_INET;
|
|
}
|
|
}
|
|
cout << "\nC4NetIO Init...";
|
|
|
|
if (!NetIO.Init(iPort))
|
|
{
|
|
cout << " Fehler: " << NetIO.GetError() << endl;
|
|
return 0;
|
|
}
|
|
|
|
cout << " ok" << endl;
|
|
|
|
|
|
if (fHost)
|
|
{
|
|
|
|
cout << " Broadcast...";
|
|
C4NetIO::addr_t addr;
|
|
if (!NetIO.InitBroadcast(&addr))
|
|
{
|
|
cout << " Fehler: " << NetIO.GetError() << endl;
|
|
return 0;
|
|
}
|
|
|
|
cout << " ok" << endl;
|
|
|
|
cout << " Thread...";
|
|
|
|
if (!CBClass.Start())
|
|
{
|
|
cout << " Fehler!" << endl;
|
|
return 0;
|
|
}
|
|
|
|
cout << " ok" << endl;
|
|
|
|
cout << "listening... " << endl;
|
|
|
|
}
|
|
else
|
|
{
|
|
cout << " Thread...";
|
|
|
|
if (!CBClass.Start())
|
|
{
|
|
cout << " Fehler!" << endl;
|
|
return 0;
|
|
}
|
|
|
|
cout << " ok" << endl;
|
|
|
|
cout << "verbinden mit " << inet_ntoa(addr.sin_addr) << ":" << ntohs(addr.sin_port) << "...\n";
|
|
#ifdef ASYNC_CONNECT
|
|
NetIO.Connect(addr);
|
|
#else
|
|
if (!fHost)
|
|
{
|
|
int iBufLen = 5000;
|
|
char *pBuf = new char [iBufLen];
|
|
for (int i = 0; i < 10; i++)
|
|
{
|
|
*pBuf = i;
|
|
if (!pNetIO->Send(C4NetIOPacket(pBuf, iBufLen, true, addr)))
|
|
cout << " Fehler: " << (pNetIO->GetError() ? pNetIO->GetError() : "bla") << endl;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
while (std::cin.get() == 10);
|
|
|
|
CBClass.Stop();
|
|
NetIO.Close();
|
|
|
|
return 1;
|
|
}
|