Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Donald Haase
Cockatrice
Commits
45890b83
Commit
45890b83
authored
Mar 22, 2011
by
Max-Wilhelm Bruker
Browse files
added send buffer to limit socket operations to one thread
parent
81a5d58d
Changes
5
Hide whitespace changes
Inline
Side-by-side
common/server.h
View file @
45890b83
...
@@ -4,6 +4,7 @@
...
@@ -4,6 +4,7 @@
#include
<QObject>
#include
<QObject>
#include
<QStringList>
#include
<QStringList>
#include
<QMap>
#include
<QMap>
#include
<QMutex>
class
Server_Game
;
class
Server_Game
;
class
Server_Room
;
class
Server_Room
;
...
@@ -22,6 +23,7 @@ private slots:
...
@@ -22,6 +23,7 @@ private slots:
void
gameClosing
(
int
gameId
);
void
gameClosing
(
int
gameId
);
void
broadcastRoomUpdate
();
void
broadcastRoomUpdate
();
public:
public:
mutable
QMutex
serverMutex
;
Server
(
QObject
*
parent
=
0
);
Server
(
QObject
*
parent
=
0
);
~
Server
();
~
Server
();
AuthenticationResult
loginUser
(
Server_ProtocolHandler
*
session
,
QString
&
name
,
const
QString
&
password
);
AuthenticationResult
loginUser
(
Server_ProtocolHandler
*
session
,
QString
&
name
,
const
QString
&
password
);
...
...
common/server_protocolhandler.cpp
View file @
45890b83
...
@@ -17,6 +17,7 @@ Server_ProtocolHandler::Server_ProtocolHandler(Server *_server, QObject *parent)
...
@@ -17,6 +17,7 @@ Server_ProtocolHandler::Server_ProtocolHandler(Server *_server, QObject *parent)
:
QObject
(
parent
),
server
(
_server
),
authState
(
PasswordWrong
),
acceptsUserListChanges
(
false
),
acceptsRoomListChanges
(
false
),
userInfo
(
0
),
timeRunning
(
0
),
lastDataReceived
(
0
)
:
QObject
(
parent
),
server
(
_server
),
authState
(
PasswordWrong
),
acceptsUserListChanges
(
false
),
acceptsRoomListChanges
(
false
),
userInfo
(
0
),
timeRunning
(
0
),
lastDataReceived
(
0
)
{
{
connect
(
server
,
SIGNAL
(
pingClockTimeout
()),
this
,
SLOT
(
pingClockTimeout
()));
connect
(
server
,
SIGNAL
(
pingClockTimeout
()),
this
,
SLOT
(
pingClockTimeout
()));
connect
(
this
,
SIGNAL
(
sigGameCreated
(
Server_Game
*
)),
this
,
SLOT
(
processSigGameCreated
(
Server_Game
*
)),
Qt
::
QueuedConnection
);
}
}
Server_ProtocolHandler
::~
Server_ProtocolHandler
()
Server_ProtocolHandler
::~
Server_ProtocolHandler
()
...
@@ -430,6 +431,13 @@ ResponseCode Server_ProtocolHandler::cmdCreateGame(Command_CreateGame *cmd, Comm
...
@@ -430,6 +431,13 @@ ResponseCode Server_ProtocolHandler::cmdCreateGame(Command_CreateGame *cmd, Comm
void
Server_ProtocolHandler
::
gameCreated
(
Server_Game
*
game
)
void
Server_ProtocolHandler
::
gameCreated
(
Server_Game
*
game
)
{
{
emit
sigGameCreated
(
game
);
}
void
Server_ProtocolHandler
::
processSigGameCreated
(
Server_Game
*
game
)
{
QMutexLocker
locker
(
&
game
->
gameMutex
);
Server_Player
*
creator
=
game
->
getPlayers
().
values
().
first
();
Server_Player
*
creator
=
game
->
getPlayers
().
values
().
first
();
games
.
insert
(
game
->
getGameId
(),
QPair
<
Server_Game
*
,
Server_Player
*>
(
game
,
creator
));
games
.
insert
(
game
->
getGameId
(),
QPair
<
Server_Game
*
,
Server_Player
*>
(
game
,
creator
));
...
...
common/server_protocolhandler.h
View file @
45890b83
...
@@ -91,7 +91,11 @@ private:
...
@@ -91,7 +91,11 @@ private:
ResponseCode
processCommandHelper
(
Command
*
command
,
CommandContainer
*
cont
);
ResponseCode
processCommandHelper
(
Command
*
command
,
CommandContainer
*
cont
);
private
slots
:
private
slots
:
void
pingClockTimeout
();
void
pingClockTimeout
();
void
processSigGameCreated
(
Server_Game
*
game
);
signals:
void
sigGameCreated
(
Server_Game
*
game
);
public:
public:
mutable
QMutex
protocolHandlerMutex
;
Server_ProtocolHandler
(
Server
*
_server
,
QObject
*
parent
=
0
);
Server_ProtocolHandler
(
Server
*
_server
,
QObject
*
parent
=
0
);
~
Server_ProtocolHandler
();
~
Server_ProtocolHandler
();
void
playerRemovedFromGame
(
Server_Game
*
game
);
void
playerRemovedFromGame
(
Server_Game
*
game
);
...
...
servatrice/src/serversocketinterface.cpp
View file @
45890b83
...
@@ -35,18 +35,18 @@
...
@@ -35,18 +35,18 @@
ServerSocketInterface
::
ServerSocketInterface
(
Servatrice
*
_server
,
QTcpSocket
*
_socket
,
QObject
*
parent
)
ServerSocketInterface
::
ServerSocketInterface
(
Servatrice
*
_server
,
QTcpSocket
*
_socket
,
QObject
*
parent
)
:
Server_ProtocolHandler
(
_server
,
parent
),
servatrice
(
_server
),
socket
(
_socket
),
topLevelItem
(
0
)
:
Server_ProtocolHandler
(
_server
,
parent
),
servatrice
(
_server
),
socket
(
_socket
),
topLevelItem
(
0
)
{
{
xmlWriter
=
new
QXmlStreamWriter
;
xmlWriter
=
new
QXmlStreamWriter
(
&
xmlBuffer
);
xmlWriter
->
setDevice
(
socket
);
xmlReader
=
new
QXmlStreamReader
;
xmlReader
=
new
QXmlStreamReader
;
connect
(
socket
,
SIGNAL
(
readyRead
()),
this
,
SLOT
(
readClient
()));
connect
(
socket
,
SIGNAL
(
readyRead
()),
this
,
SLOT
(
readClient
()));
connect
(
socket
,
SIGNAL
(
disconnected
()),
this
,
SLOT
(
deleteLater
()));
connect
(
socket
,
SIGNAL
(
disconnected
()),
this
,
SLOT
(
deleteLater
()));
connect
(
socket
,
SIGNAL
(
error
(
QAbstractSocket
::
SocketError
)),
this
,
SLOT
(
catchSocketError
(
QAbstractSocket
::
SocketError
)));
connect
(
socket
,
SIGNAL
(
error
(
QAbstractSocket
::
SocketError
)),
this
,
SLOT
(
catchSocketError
(
QAbstractSocket
::
SocketError
)));
connect
(
this
,
SIGNAL
(
xmlBufferChanged
()),
this
,
SLOT
(
flushXmlBuffer
()),
Qt
::
QueuedConnection
);
xmlWriter
->
writeStartDocument
();
xmlWriter
->
writeStartDocument
();
xmlWriter
->
writeStartElement
(
"cockatrice_server_stream"
);
xmlWriter
->
writeStartElement
(
"cockatrice_server_stream"
);
xmlWriter
->
writeAttribute
(
"version"
,
QString
::
number
(
ProtocolItem
::
protocolVersion
));
xmlWriter
->
writeAttribute
(
"version"
,
QString
::
number
(
ProtocolItem
::
protocolVersion
));
flushXmlBuffer
();
int
maxUsers
=
_server
->
getMaxUsersPerAddress
();
int
maxUsers
=
_server
->
getMaxUsersPerAddress
();
if
((
maxUsers
>
0
)
&&
(
_server
->
getUsersWithAddress
(
socket
->
peerAddress
())
>=
maxUsers
))
{
if
((
maxUsers
>
0
)
&&
(
_server
->
getUsersWithAddress
(
socket
->
peerAddress
())
>=
maxUsers
))
{
...
@@ -58,6 +58,8 @@ ServerSocketInterface::ServerSocketInterface(Servatrice *_server, QTcpSocket *_s
...
@@ -58,6 +58,8 @@ ServerSocketInterface::ServerSocketInterface(Servatrice *_server, QTcpSocket *_s
ServerSocketInterface
::~
ServerSocketInterface
()
ServerSocketInterface
::~
ServerSocketInterface
()
{
{
QMutexLocker
locker
(
&
protocolHandlerMutex
);
logger
->
logMessage
(
"ServerSocketInterface destructor"
);
logger
->
logMessage
(
"ServerSocketInterface destructor"
);
socket
->
flush
();
socket
->
flush
();
...
@@ -75,8 +77,18 @@ void ServerSocketInterface::processProtocolItem(ProtocolItem *item)
...
@@ -75,8 +77,18 @@ void ServerSocketInterface::processProtocolItem(ProtocolItem *item)
processCommandContainer
(
cont
);
processCommandContainer
(
cont
);
}
}
void
ServerSocketInterface
::
flushXmlBuffer
()
{
QMutexLocker
locker
(
&
xmlBufferMutex
);
socket
->
write
(
xmlBuffer
.
toUtf8
());
socket
->
flush
();
xmlBuffer
.
clear
();
}
void
ServerSocketInterface
::
readClient
()
void
ServerSocketInterface
::
readClient
()
{
{
QMutexLocker
locker
(
&
protocolHandlerMutex
);
QByteArray
data
=
socket
->
readAll
();
QByteArray
data
=
socket
->
readAll
();
logger
->
logMessage
(
QString
(
data
));
logger
->
logMessage
(
QString
(
data
));
xmlReader
->
addData
(
data
);
xmlReader
->
addData
(
data
);
...
@@ -101,13 +113,13 @@ void ServerSocketInterface::catchSocketError(QAbstractSocket::SocketError socket
...
@@ -101,13 +113,13 @@ void ServerSocketInterface::catchSocketError(QAbstractSocket::SocketError socket
void
ServerSocketInterface
::
sendProtocolItem
(
ProtocolItem
*
item
,
bool
deleteItem
)
void
ServerSocketInterface
::
sendProtocolItem
(
ProtocolItem
*
item
,
bool
deleteItem
)
{
{
static
QMutex
m
utex
;
QMutexLocker
locker
(
&
xmlBufferM
utex
)
;
mutex
.
lock
();
item
->
write
(
xmlWriter
);
item
->
write
(
xmlWriter
);
socket
->
flush
();
mutex
.
unlock
();
if
(
deleteItem
)
if
(
deleteItem
)
delete
item
;
delete
item
;
emit
xmlBufferChanged
();
}
}
int
ServerSocketInterface
::
getUserIdInDB
(
const
QString
&
name
)
const
int
ServerSocketInterface
::
getUserIdInDB
(
const
QString
&
name
)
const
...
...
servatrice/src/serversocketinterface.h
View file @
45890b83
...
@@ -22,6 +22,7 @@
...
@@ -22,6 +22,7 @@
#include
<QTcpSocket>
#include
<QTcpSocket>
#include
<QHostAddress>
#include
<QHostAddress>
#include
<QMutex>
#include
"server_protocolhandler.h"
#include
"server_protocolhandler.h"
class
QTcpSocket
;
class
QTcpSocket
;
...
@@ -30,6 +31,7 @@ class QXmlStreamReader;
...
@@ -30,6 +31,7 @@ class QXmlStreamReader;
class
QXmlStreamWriter
;
class
QXmlStreamWriter
;
class
DeckList
;
class
DeckList
;
class
TopLevelProtocolItem
;
class
TopLevelProtocolItem
;
class
QByteArray
;
class
ServerSocketInterface
:
public
Server_ProtocolHandler
class
ServerSocketInterface
:
public
Server_ProtocolHandler
{
{
...
@@ -38,11 +40,16 @@ private slots:
...
@@ -38,11 +40,16 @@ private slots:
void
readClient
();
void
readClient
();
void
catchSocketError
(
QAbstractSocket
::
SocketError
socketError
);
void
catchSocketError
(
QAbstractSocket
::
SocketError
socketError
);
void
processProtocolItem
(
ProtocolItem
*
item
);
void
processProtocolItem
(
ProtocolItem
*
item
);
void
flushXmlBuffer
();
signals:
void
xmlBufferChanged
();
private:
private:
QMutex
xmlBufferMutex
;
Servatrice
*
servatrice
;
Servatrice
*
servatrice
;
QTcpSocket
*
socket
;
QTcpSocket
*
socket
;
QXmlStreamWriter
*
xmlWriter
;
QXmlStreamWriter
*
xmlWriter
;
QXmlStreamReader
*
xmlReader
;
QXmlStreamReader
*
xmlReader
;
QString
xmlBuffer
;
TopLevelProtocolItem
*
topLevelItem
;
TopLevelProtocolItem
*
topLevelItem
;
int
getUserIdInDB
(
const
QString
&
name
)
const
;
int
getUserIdInDB
(
const
QString
&
name
)
const
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment