Network Development Kit 2.0






4.88/5 (107 votes)
Network Development Kit is a set of simple classes for a client-server architecture.
NDK Standard
NDK in an Extension DLL
Introduction
With the success of NDK 1.0, I decided to improve the functionality. NDK represents Network Development Kit. The NDK is a set of classes that implements a client/server architecture. The NDK hides all the complexity of the connection, sending, and receiving of data over a network. You only have to deal with three classes: CNDKServer
, CNDKClient
, and CNDKMessage
. With just a few methods to override, you obtain a complete robust client/server application. The NDK is based on the class CSocket
from MFC, so you can run your application on a local network or on the Internet without any change. To easily understand the integration of the NDK in an application, you'll find at the end of this article a complete chat application.
Classes
CNDKServer: Server side of the client/server architecture
Attributes:
BOOL IsStarted() const;
long GetPort() const;
long GetNbUsers() const;
void GetUserIds(CLongArray& alIds) const;
Operations:
BOOL StartListening(long lPort);
void Stop();
BOOL SendMessageToUser(long lUserId, CNDKMessage& message);
BOOL SendMessageToAllUsers(CNDKMessage& message);
BOOL SendMessageToSomeUsers(const CLongArray& alUserIds, CNDKMessage& message);
BOOL SendMessageToAllUsersExceptFor(long lUserId, CNDKMessage& message);
BOOL SendMessageToAllUsersExceptFor(const CLongArray& alUserIds, CNDKMessage& message);
BOOL DisconnectUser(long lUserId);
void DisconnectAllUsers();
BOOL PingUser(long lUserId);
void PingAllUsers();
Callbacks:
virtual BOOL OnIsConnectionAccepted() = 0;
virtual void OnConnect(long lUserId) = 0;
virtual void OnMessage(long lUserId, CNDKMessage& message) = 0;
virtual void OnDisconnect(long lUserId, NDKServerDisconnection disconnectionType) = 0;
virtual void OnPing(long lUserId, long lNbMilliseconds);
CNDKClient: Client side of the client/server architecture
Attributes:
BOOL IsConnected() const;
BOOL GetIpAndPort(CString& strIp, long& lPort) const;
Operations:
BOOL OpenConnection(const CString& strServerIp, long lPort);
void CloseConnection();
BOOL SendMessageToServer(CNDKMessage& message);
BOOL PingServer();
Callbacks:
virtual void OnMessage(CNDKMessage& message) = 0;
virtual void OnDisconnect(NDKClientDisconnection disconnectionType) = 0;
virtual void OnPing(long lNbMilliseconds);
CNDKMessage: Encapsulation of the data that is sent and received by CNDKServer and CNDKClient
Attributes:
void SetId(long lId);
long GetId() const;
int GetNbElements() const;
Operations:
void Add(TYPE typeData);
void SetAt(long lIndex, TYPE typeData);
void GetAt(long lIndex, TYPE& typeData) const;
void GetNext(TYPE& typeData);
Where
TYPE
can be aUCHAR
,char
,USHORT
,short
,UINT
,int
,long
,float
,double
,CString
, orLPVOID
data.
What's new in 2.0
- Hungarian notation is used everywhere
CNDKServer
notifies automaticallyCNDKClient
when it disconnects and vice-versaCNDKServer
has new methods to send a message to a group of usersCNDKMessage
is easier to use and more robust- New methods to ping the server or the client
- NDK prefix added to all classes to make sure that all class names are unique in your project
- NDK is standalone or encapsulated in an extension DLL
Client/Server chat
Here are two screenshots of the chat application. Most features of the NDK are shown in both programs.
Sample code from the chat client
void CChatClientDlg::OnButtonSend() { if (UpdateData(TRUE)) { // Create the message with a unique Id: ChatText CNDKMessage message(ChatText); // Add the data into the message message.Add(m_strChatInput); // Send the message to the server SendMessageToServer(message); // Update the UI of the dialog AddText(m_strChatInput); m_strChatInput.Empty(); UpdateData(FALSE); } }
Sample code from the chat server
void CChatServerDlg::OnMessage(long lUserId, CNDKMessage& message) { switch (message.GetId()) { //... case ChatText: { CString strNickname; // Obtain the nickname stored in the map m_mapIdsNicknames.Lookup(lUserId, strNickname); CString strText; // Get the text encapsulated in the message message.GetAt(0, strText); // Update the UI of the dialog AddText(strNickname + _T(": ") + strText); // Prepare the message message.SetAt(0, strNickname); message.SetAt(1, strText); // Send the message to all others users SendMessageToAllUsersExceptFor(lUserId, message); } break; //... } }
History
- 17 December 2006
- Fixed a bug in
NDKMessage
concerning the length parameter of theGetAt
andGetNext
methods.
- Fixed a bug in
- 14 October 2005
- Telnet connections are now disconnected when a connection sends data to the server. Thanks to Stephan Douglas for the solution.
- Fixed a bug that resolves socket notification since the NDK uses Visual C++ .NET. After a short time, socket notifications were not send anymore.
- A verification is now made in the serialization of a
CNDKMessage
to make sure that the message is really aCNDKMessage
. - Fixed a bug in the method
SendMessageToSomeUsers
in the NDKServer.cpp. - The project is now converted for Visual C++ .NET.
Fact
In 2002, the NDK was used in two NASA experiments for the Endeavor mission.
Conclusion
You don't have to be a guru of networking to create a client/server application, you only need to understand the above classes.
If you use the NDK in your project, I would really appreciate to receive an E-mail from you. I plan to make a web page of all programs using the NDK.
I would like to thank Yannick Létourneau who helped me in NDK 1.0.
Good Programming!