在网络编程中,TCP通信是一种常见的通信方式。本文将介绍如何使用TcpListener和TcpClient进行TCP通信,以及如何获取连接客户端的IP地址。
首先,不需要创建一个类来处理客户端和服务器之间的通信,因为已经存在TcpListener和TcpClient这两个类。TcpListener用于服务器端,而TcpClient用于客户端。
TcpListener * pTcpListener;
pTcpListener = new TcpListener(80);
pTcpListener->Start();
上述代码创建了一个TcpListener对象,并监听80端口。当客户端连接到80端口时,TcpListener的AcceptTcpClient()方法将返回一个TcpClient对象。
TcpClient * pTcpClient;
pTcpClient = m_TcpListener->AcceptTcpClient();
这两个类结合使用非常强大。应该创建一个线程来使用TcpClient,并等待接受另一个客户端。
在实际应用中,经常需要获取连接客户端的IP地址。但是,直接从TcpClient对象中获取IP地址并不是一件容易的事情。即使获取了NetworkStream对象,也无法直接获取IP地址。
NetworkStream * networkStream = pTcpClient->GetStream();
networkStream->Read(bytes, 0, (int) pTcpClient->ReceiveBufferSize);
为了解决这个问题,需要创建一个从NetworkStream派生的类。
下面是一个自定义的NetworkStream类,它提供了获取Socket和IP地址的方法。
// 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
#using
#using
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());
}
有了这个自定义的NetworkStream类,就可以轻松地获取客户端的IP地址和Socket了。
NetworkStream * networkStream = pTcpClient->GetStream();
MyNetworkStream * myStream = static_cast(networkStream);
String * ClientIP = myStream->get_IPAddress();
Console::Write("Client IP Address ");
Console::WriteLine(ClientIP);
networkStream->Read(bytes, 0, (int) pTcpClient->ReceiveBufferSize);
这样,就成功地获取了客户端的IP地址。如果不使用TcpClient,也可以使用AcceptSocket()代替AcceptTcpClient()来获取Socket。有了Socket,就可以使用get_RemoteEndPoint()方法了。