65.9K
CodeProject is changing. Read more.
Home

How to get the clients IP address using TcpClient in Managed C++

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (13 votes)

Apr 11, 2002

1 min read

viewsIcon

266004

How to get the clients IP address using TcpClient in Managed C++

Introduction

In managed C++ using sockets, Microsoft is giving you a whole set of new tools to use Sockets. So you don't have to create a class to handle Client and Server communications. These classes are TcpListener for the server and TcpClient.

 
TcpListener * pTcpListener;
TcpListener = new TcpListener(80);
TcpListener->Start(); 
TcpClient * pTcpClient; 
pTcpClient = m_TcpListener->AcceptTcpClient();

This opens port 80 and listens for connections. When a client connects to port 80, the function AcceptTcpClient() returns with a TcpClient class.

Those two classes together are very powerful. You should create a thread to use the TcpClient and wait again to accept another client.

The problem I had is I need it to get the IP address of the Client. I couldn't find the way to get it from the TcpClient, even after I get the Stream like this:

 NetworkStream * networkStream = pTcpClient->GetStream();
networkStream->Read(bytes, 0, (int) pTcpClient->ReceiveBufferSize);

Now that I had a NetworkStream I thought I could get the IP address, well I was wrong again. networkStream->getSocket() is a private member of the class NetworkStream.

So, to resolve this problem I had to create a derived class from NetworkStream:

//MyNetworkStream.h
#pragma once

__gc class MyNetworkStream : public NetworkStream
{
public:
	MyNetworkStream(void) : NetworkStream(0) { };
	MyNetworkStream(System::Net::Sockets::Socket * s) : NetworkStream(s) { };
	
	System::Net::Sockets::Socket * get_MySocket();
	String * get_IPAddress(void);
};



//MyNetworkStream.cpp file
#using <System.dll>
#using <mscorlib.dll>
using System::Net::Sockets::NetworkStream;
using System::String;

#include "myNetworkStream.h"


System::Net::Sockets::Socket * MyNetworkStream::get_MySocket()
{
	return(this->get_Socket());
}

String * MyNetworkStream::get_IPAddress(void)
{
	System::Net::Sockets::Socket *soc = get_Socket();
	System::Net::EndPoint		*Endp = soc->get_RemoteEndPoint();

	return(Endp->ToString());
}

So when you have this class, you only have to do something like that to get the client's IP address and socket:

NetworkStream * networkStream = pTcpClient->GetStream(); 
MyNetworkStream * myStream =  static_cast<MyNetworkStream *>(networkStream);
ClientIP = myStream->get_IPAddress();
Console::Write(S"Client IP Address ");
Console::WriteLine(ClientIP);
networkStream->Read(bytes, 0, (int) pTcpClient->ReceiveBufferSize);

There you go! IP address and everything. Now if you don't use TcpClient, you could AcceptSocket() instead of AcceptTcpClient() to get the socket. When you have the socket you can use get_RemoteEndPoint(), but I thought that you will like to use TcpClient.

Have fun!