Rewriting connectivity tool for google protocol buffers.

This commit is contained in:
lotodore
2013-01-05 14:24:45 +01:00
parent 1c5c3a5a1d
commit 6b6fa24ead
2 changed files with 104 additions and 112 deletions
+9 -12
View File
@@ -18,21 +18,20 @@ QT -= core gui
#PRECOMPILED_HEADER = src/pch_lib.h #PRECOMPILED_HEADER = src/pch_lib.h
INCLUDEPATH += . \ INCLUDEPATH += . \
src \ src
src/third_party/asn1
DEPENDPATH += . \ DEPENDPATH += . \
src \ src
src/third_party/asn1
# Input # Input
HEADERS += \ HEADERS += \
src/game_defs.h src/game_defs.h \
src/net/netpacket.h \
src/third_party/protobuf/pokerth.pb.h
SOURCES += \ SOURCES += \
src/connectivity.cpp src/connectivity.cpp \
src/net/common/netpacket.cpp \
LIBS += -lpokerth_protocol src/third_party/protobuf/pokerth.pb.cc
unix : !mac { unix : !mac {
@@ -82,9 +81,7 @@ unix : !mac {
kFreeBSD = $$find(UNAME, "kFreeBSD") kFreeBSD = $$find(UNAME, "kFreeBSD")
LIBS += $$BOOST_LIBS LIBS += $$BOOST_LIBS
LIBS += -lgsasl -lgcrypt -lidn LIBS += -lprotobuf -lgsasl -lgcrypt -lidn
POST_TARGETDEPS += ./lib/libpokerth_protocol.a
#### INSTALL #### #### INSTALL ####
+92 -97
View File
@@ -31,22 +31,20 @@
// Connectivity test program for PokerTH // Connectivity test program for PokerTH
#include <third_party/asn1/PokerTHMessage.h>
#include <boost/program_options.hpp>
#include <boost/asio.hpp> #include <boost/asio.hpp>
#include <third_party/protobuf/pokerth.pb.h>
#include <net/netpacket.h>
#include <boost/program_options.hpp>
#include <boost/array.hpp> #include <boost/array.hpp>
#include <third_party/boost/timers.hpp> #include <third_party/boost/timers.hpp>
#include <gsasl.h> #include <gsasl.h>
#include <iostream> #include <iostream>
#define STL_STRING_FROM_OCTET_STRING(_a) (string((const char *)(_a).buf, (_a).size))
using namespace std; using namespace std;
using boost::asio::ip::tcp; using boost::asio::ip::tcp;
namespace po = boost::program_options; namespace po = boost::program_options;
#define BUF_SIZE 1024 #define BUF_SIZE 1024
// Global receive buffer // Global receive buffer
boost::array<char, BUF_SIZE> recBuf; boost::array<char, BUF_SIZE> recBuf;
@@ -61,44 +59,65 @@ net_packet_print_to_string(const void *buffer, size_t size, void *packetStr)
return 0; return 0;
} }
/*string packetString; boost::shared_ptr<NetPacket>
xer_encode(&asn_DEF_PokerTHMessage, msg, XER_F_BASIC, &net_packet_print_to_string, &packetString);
cout << packetString << endl;*/
PokerTHMessage_t *
receiveMessage(tcp::socket &socket) receiveMessage(tcp::socket &socket)
{ {
PokerTHMessage_t *msg = NULL; boost::shared_ptr<NetPacket> tmpPacket;
do { do {
asn_dec_rval_t retVal = ber_decode(0, &asn_DEF_PokerTHMessage, (void **)&msg, recBuf.data(), recBufPos); // This is necessary, because we use TCP.
if(retVal.code == RC_OK && msg != NULL) { // Packets may be received in multiple chunks or
if (retVal.consumed < recBufPos) { // several packets may be received at once.
recBufPos -= retVal.consumed; if (recBufPos >= NET_HEADER_SIZE) {
memmove(recBuf.c_array(), recBuf.c_array() + retVal.consumed, recBufPos); // Read the size of the packet (first 4 bytes in network byte order).
} else { uint32_t nativeVal;
memcpy(&nativeVal, recBuf.c_array(), sizeof(uint32_t));
size_t packetSize = ntohl(nativeVal);
if (packetSize > MAX_PACKET_SIZE) {
recBufPos = 0; recBufPos = 0;
cout << "Packet too large" << endl;
return boost::shared_ptr<NetPacket>();
} else if (recBufPos >= packetSize + NET_HEADER_SIZE) {
try {
tmpPacket = NetPacket::Create(&recBuf.c_array()[NET_HEADER_SIZE], packetSize);
if (tmpPacket) {
recBufPos -= (packetSize + NET_HEADER_SIZE);
if (recBufPos) {
memmove(recBuf.c_array(), recBuf.c_array() + packetSize + NET_HEADER_SIZE, recBufPos);
} }
} else { }
// Free the partially decoded message (if applicable). } catch (const exception &) {
ASN_STRUCT_FREE(asn_DEF_PokerTHMessage, msg); // Reset buffer on error.
msg = NULL; recBufPos = 0;
cout << "Packet creation failed" << endl;
return boost::shared_ptr<NetPacket>();
}
}
}
if (!tmpPacket) {
recBufPos += socket.receive(boost::asio::buffer(recBuf.c_array() + recBufPos, BUF_SIZE - recBufPos)); recBufPos += socket.receive(boost::asio::buffer(recBuf.c_array() + recBufPos, BUF_SIZE - recBufPos));
if (recBufPos == 0) {
cout << "Receive failed" << endl;
return boost::shared_ptr<NetPacket>();
} }
} while (msg == NULL); }
return msg; } while (!tmpPacket);
return tmpPacket;
} }
bool bool
sendMessage(tcp::socket &socket, PokerTHMessage_t *msg) sendMessage(tcp::socket &socket, boost::shared_ptr<NetPacket> packet)
{ {
bool retVal = false; bool retVal = false;
if (msg) { if (packet) {
asn_enc_rval_t e = der_encode_to_buffer(&asn_DEF_PokerTHMessage, msg, sendBuf.data(), BUF_SIZE); uint32_t packetSize = packet->GetMsg()->ByteSize();
if (e.encoded != -1) { google::protobuf::uint8 *buf = new google::protobuf::uint8[packetSize + NET_HEADER_SIZE];
socket.send(boost::asio::buffer(sendBuf.data(), e.encoded)); *((uint32_t *)buf) = htonl(packetSize);
retVal = true; packet->GetMsg()->SerializeWithCachedSizesToArray(&buf[NET_HEADER_SIZE]);
} retVal = socket.send(boost::asio::buffer(buf, packetSize + NET_HEADER_SIZE)) != 0;
ASN_STRUCT_FREE(asn_DEF_PokerTHMessage, msg); delete[] buf;
} }
return retVal; return retVal;
} }
@@ -177,25 +196,22 @@ main(int argc, char *argv[])
perfTimer.restart(); perfTimer.restart();
// Receive server information // Receive server information
PokerTHMessage_t *msg = receiveMessage(socket); boost::shared_ptr<NetPacket> msg = receiveMessage(socket);
if (!msg || msg->present != PokerTHMessage_PR_announceMessage) { if (!msg || msg->GetMsg()->messagetype() != PokerTHMessage_PokerTHMessageType_Type_AnnounceMessage) {
cout << "Announce failed" << endl; cout << "Announce failed" << endl;
return 1; return 1;
} }
ASN_STRUCT_FREE(asn_DEF_PokerTHMessage, msg);
// Send init // Send init
msg = (PokerTHMessage_t *)calloc(1, sizeof(PokerTHMessage_t)); msg.reset(new NetPacket);
msg->present = PokerTHMessage_PR_initMessage; msg->GetMsg()->set_messagetype(PokerTHMessage_PokerTHMessageType_Type_InitMessage);
InitMessage_t *netInit = &msg->choice.initMessage; InitMessage *netInit = msg->GetMsg()->mutable_initmessage();
netInit->requestedVersion.major = 5; netInit->mutable_requestedversion()->set_majorversion(NET_VERSION_MAJOR);
netInit->requestedVersion.minor = 0; netInit->mutable_requestedversion()->set_minorversion(NET_VERSION_MINOR);
netInit->set_buildid(0);
if (password.empty()) { if (password.empty()) {
netInit->login.present = login_PR_guestLogin; netInit->set_login(InitMessage_LoginType_guestLogin);
GuestLogin_t *guestLogin = &netInit->login.choice.guestLogin; netInit->set_nickname(username);
OCTET_STRING_fromBuf(&guestLogin->nickName,
username.c_str(),
username.length());
if (!sendMessage(socket, msg)) { if (!sendMessage(socket, msg)) {
cout << "Init guest failed" << endl; cout << "Init guest failed" << endl;
return 1; return 1;
@@ -206,8 +222,7 @@ main(int argc, char *argv[])
gsasl_property_set(authSession, GSASL_AUTHID, username.c_str()); gsasl_property_set(authSession, GSASL_AUTHID, username.c_str());
gsasl_property_set(authSession, GSASL_PASSWORD, password.c_str()); gsasl_property_set(authSession, GSASL_PASSWORD, password.c_str());
netInit->login.present = login_PR_authenticatedLogin; netInit->set_login(InitMessage_LoginType_authenticatedLogin);
AuthenticatedLogin_t *authLogin = &netInit->login.choice.authenticatedLogin;
char *tmpOut; char *tmpOut;
size_t tmpOutSize; size_t tmpOutSize;
@@ -221,23 +236,20 @@ main(int argc, char *argv[])
} }
gsasl_free(tmpOut); gsasl_free(tmpOut);
OCTET_STRING_fromBuf(&authLogin->clientUserData, netInit->set_clientuserdata(nextGsaslMsg);
nextGsaslMsg.c_str(),
nextGsaslMsg.length());
if (!sendMessage(socket, msg)) { if (!sendMessage(socket, msg)) {
cout << "Init auth request failed" << endl; cout << "Init auth request failed" << endl;
return 1; return 1;
} }
msg = receiveMessage(socket); msg = receiveMessage(socket);
if (!msg || msg->present != PokerTHMessage_PR_authMessage) { if (!msg || msg->GetMsg()->messagetype() != PokerTHMessage_PokerTHMessageType_Type_AuthServerChallengeMessage) {
cout << "Auth request failed" << endl; cout << "Auth request failed" << endl;
return 1; return 1;
} }
AuthMessage_t *netAuth = &msg->choice.authMessage; const AuthServerChallengeMessage &netAuth = msg->GetMsg()->authserverchallengemessage();
AuthServerChallenge_t *netChallenge = &netAuth->choice.authServerChallenge; string challengeStr(netAuth.serverchallenge());
string challengeStr = STL_STRING_FROM_OCTET_STRING(netChallenge->serverChallenge);
errorCode = gsasl_step(authSession, challengeStr.c_str(), challengeStr.size(), &tmpOut, &tmpOutSize); errorCode = gsasl_step(authSession, challengeStr.c_str(), challengeStr.size(), &tmpOut, &tmpOutSize);
if (errorCode == GSASL_NEEDS_MORE) { if (errorCode == GSASL_NEEDS_MORE) {
nextGsaslMsg = string(tmpOut, tmpOutSize); nextGsaslMsg = string(tmpOut, tmpOutSize);
@@ -246,22 +258,16 @@ main(int argc, char *argv[])
return 1; return 1;
} }
gsasl_free(tmpOut); gsasl_free(tmpOut);
ASN_STRUCT_FREE(asn_DEF_PokerTHMessage, msg); msg.reset(new NetPacket);
msg = (PokerTHMessage_t *)calloc(1, sizeof(PokerTHMessage_t)); msg->GetMsg()->set_messagetype(PokerTHMessage_PokerTHMessageType_Type_AuthClientResponseMessage);
msg->present = PokerTHMessage_PR_authMessage; AuthClientResponseMessage *outAuth = msg->GetMsg()->mutable_authclientresponsemessage();
AuthMessage_t *outAuth = &msg->choice.authMessage; outAuth->set_clientresponse(nextGsaslMsg);
outAuth->present = AuthMessage_PR_authClientResponse;
AuthClientResponse_t *outResponse = &outAuth->choice.authClientResponse;
OCTET_STRING_fromBuf(&outResponse->clientResponse,
nextGsaslMsg.c_str(),
nextGsaslMsg.length());
if (!sendMessage(socket, msg)) { if (!sendMessage(socket, msg)) {
cout << "Init auth response failed" << endl; cout << "Init auth response failed" << endl;
return 1; return 1;
} }
msg = receiveMessage(socket); msg = receiveMessage(socket);
if (!msg || msg->present != PokerTHMessage_PR_authMessage) { if (!msg || msg->GetMsg()->messagetype() != PokerTHMessage_PokerTHMessageType_Type_AuthServerVerificationMessage) {
cout << "Auth response failed" << endl; cout << "Auth response failed" << endl;
return 1; return 1;
} }
@@ -270,11 +276,10 @@ main(int argc, char *argv[])
// Receive init ack // Receive init ack
msg = receiveMessage(socket); msg = receiveMessage(socket);
if (!msg || msg->present != PokerTHMessage_PR_initAckMessage) { if (!msg || msg->GetMsg()->messagetype() != PokerTHMessage_PokerTHMessageType_Type_InitAckMessage) {
cout << "Init ack failed" << endl; cout << "Init ack failed" << endl;
return 1; return 1;
} }
ASN_STRUCT_FREE(asn_DEF_PokerTHMessage, msg);
if (mode == 1) { if (mode == 1) {
cout << "Init.value " << perfTimer.elapsed().total_milliseconds() << endl; cout << "Init.value " << perfTimer.elapsed().total_milliseconds() << endl;
@@ -282,55 +287,45 @@ main(int argc, char *argv[])
perfTimer.restart(); perfTimer.restart();
// Send create game // Send create game
msg = (PokerTHMessage_t *)calloc(1, sizeof(PokerTHMessage_t)); msg.reset(new NetPacket);
msg->present = PokerTHMessage_PR_joinGameRequestMessage; msg->GetMsg()->set_messagetype(PokerTHMessage_PokerTHMessageType_Type_JoinNewGameMessage);
JoinGameRequestMessage_t *netJoinGame = &msg->choice.joinGameRequestMessage; JoinNewGameMessage *joinNew = msg->GetMsg()->mutable_joinnewgamemessage();
netJoinGame->autoLeave = 0; joinNew->set_autoleave(false);
netJoinGame->joinGameAction.present = joinGameAction_PR_joinNewGame; NetGameInfo *tmpGameInfo = joinNew->mutable_gameinfo();
JoinNewGame_t *joinNew = &netJoinGame->joinGameAction.choice.joinNewGame;
string tmpGameName("_perftest_do_not_join_" + username); string tmpGameName("_perftest_do_not_join_" + username);
joinNew->gameInfo.netGameType = netGameType_normalGame; tmpGameInfo->set_netgametype(NetGameInfo_NetGameType_normalGame);
joinNew->gameInfo.maxNumPlayers = 10; tmpGameInfo->set_maxnumplayers(10);
joinNew->gameInfo.raiseIntervalMode.present = raiseIntervalMode_PR_raiseEveryHands; tmpGameInfo->set_raiseintervalmode(NetGameInfo_RaiseIntervalMode_raiseOnHandNum);
joinNew->gameInfo.raiseIntervalMode.choice.raiseEveryHands = 5; tmpGameInfo->set_raiseeveryhands(5);
joinNew->gameInfo.endRaiseMode = endRaiseMode_keepLastBlind; tmpGameInfo->set_endraisemode(NetGameInfo_EndRaiseMode_keepLastBlind);
joinNew->gameInfo.proposedGuiSpeed = 5; tmpGameInfo->set_proposedguispeed(5);
joinNew->gameInfo.delayBetweenHands = 6; tmpGameInfo->set_delaybetweenhands(6);
joinNew->gameInfo.playerActionTimeout = 10; tmpGameInfo->set_playeractiontimeout(10);
joinNew->gameInfo.endRaiseSmallBlindValue = 0; tmpGameInfo->set_endraisesmallblindvalue(0);
joinNew->gameInfo.firstSmallBlind = 50; tmpGameInfo->set_firstsmallblind(50);
joinNew->gameInfo.startMoney = 2000; tmpGameInfo->set_startmoney(2000);
OCTET_STRING_fromBuf(&joinNew->gameInfo.gameName, tmpGameInfo->set_gamename(tmpGameName);
tmpGameName.c_str(),
tmpGameName.length());
string tmpGamePassword("blah123"); string tmpGamePassword("blah123");
joinNew->password = OCTET_STRING_new_fromBuf( joinNew->set_password(tmpGamePassword);
&asn_DEF_UTF8String,
tmpGamePassword.c_str(),
tmpGamePassword.length());
if (!sendMessage(socket, msg)) { if (!sendMessage(socket, msg)) {
cout << "Create game failed" << endl; cout << "Create game failed" << endl;
return 1; return 1;
} }
msg = NULL;
// Receive join game ack // Receive join game ack
do { do {
ASN_STRUCT_FREE(asn_DEF_PokerTHMessage, msg);
msg = receiveMessage(socket); msg = receiveMessage(socket);
if (!msg) { if (!msg) {
cout << "Receive in lobby failed" << endl; cout << "Receive in lobby failed" << endl;
return 1; return 1;
} }
if (msg->present == PokerTHMessage_PR_errorMessage) { if (msg->GetMsg()->messagetype() == PokerTHMessage_PokerTHMessageType_Type_ErrorMessage) {
cout << "Received error" << endl; cout << "Received error" << endl;
return 1; return 1;
} } else if (msg->GetMsg()->messagetype() == PokerTHMessage_PokerTHMessageType_Type_JoinGameFailedMessage) {
} while (msg->present != PokerTHMessage_PR_joinGameReplyMessage);
if (msg->choice.joinGameReplyMessage.joinGameResult.present != joinGameResult_PR_joinGameAck) {
cout << "Join game ack failed" << endl; cout << "Join game ack failed" << endl;
return 1; return 1;
} }
ASN_STRUCT_FREE(asn_DEF_PokerTHMessage, msg); } while (msg->GetMsg()->messagetype() != PokerTHMessage_PokerTHMessageType_Type_JoinGameAckMessage);
if (mode == 1) { if (mode == 1) {
cout << "CreateGame.value " << perfTimer.elapsed().total_milliseconds() << endl; cout << "CreateGame.value " << perfTimer.elapsed().total_milliseconds() << endl;