自己写的一个简单的IP组类

//-----------------------------------文件名:ipgroup.h----------------------------------

#ifndef SUNXYIPGROUP_H
#define SUNXYIPGROUP_H
#include <string>
#include <ctype.h>
#define MAXLONGIP (255*255*255*255+255*255*255+255*255+255)
using namespace std;
class SunxyIPGroup
{
 public:
  //构造函数,提供起始IP和终止IP
  SunxyIPGroup(const char* startip,const char* endip);
        virtual ~SunxyIPGroup();
  //取得当前IP的下一个IP
        string GetNextIP(const char* curip,int offset);
  //取得起始IP
        string GetFirstIP();
  //取得终止IP
        string GetLastIP();
  //取得当前IP
  string GetCurIP();
  //相对IP总个数
        unsigned long TotalIPNum();
  //相对当前IP
        unsigned long CurIPNum();
  //取得起始IP长字
  unsigned long GetLastIPLong();
  //取得终止IP长字
  unsigned long GetFirstIPLong();
  //取得当前IP长字
  unsigned long GetCurIPLong();
  //初始化成功标志
        bool InitOK;
 private:
  //起始IP长字及其分解部分
        unsigned long startiplong;
  unsigned long startlip[4];
  string startsip[4];  
  //终止IP长字及其分解部分
        unsigned long endiplong;
  unsigned long endlip[4];
  string endsip[4];    
  //当前IP长字及其分解部分
  unsigned long curiplong;
  unsigned long curlip[4];
  string cursip[4];
  //临时分解IP缓存
  unsigned long tempiplong;
  string tempsip[4];
        unsigned long templip[4];
  //相对IP个数
  unsigned long totalipnum;  
        unsigned long curipnum;    
        //检查以字符串数组为形式的IP地址有效性,并拆分到指定的缓存内,返回值为是否拆分成功
        bool DivideIP(const char* inputip,unsigned long* inputlip,string* inputsip);
  //将指定缓存内的IP分解部分组合起来,返回组合好的以字符口串为形式的IP地址
        string AssembleIP(unsigned long inputip,unsigned long* inputlip,string* inputsip);
  //除去IP中为广播地址或网段地址等无效地址
        unsigned long ValidLongIP(unsigned long inputip);
};

//公共接口函数定义
SunxyIPGroup::SunxyIPGroup(const char* startip,const char* endip="")
{
    string stemp1(startip);
    string stemp2(endip);
 int i;
    //成员变量初始化
    InitOK=false;

 startiplong=0;
 endiplong=0;
 curiplong=0;

 totalipnum=0;
    curipnum=0;
 tempiplong=0;

    for(i=0;i<4;i++)
    {
  startlip[i]=0;
  startsip[i]="";

  endlip[i]=0;
  endsip[i]="";

  curlip[i]=0;
  cursip[i]="";

        tempsip[i]="";
        templip[i]=0;
    }
    //设置成员变量并构造IP组
    if(DivideIP(stemp1.c_str(),startlip,startsip))
    {
        startiplong=255*255*255*startlip[0]
                   +255*255*startlip[1]
                   +255*startlip[2]
                   +startlip[3];
  if(stemp2.empty ())
  {
   for(i=0;i<3;i++)
   {
    endlip[i]=startlip[i];
    endsip[i]=startsip[i];
   }
   endlip[i]=254;
   endsip[i]="254";
   endiplong=255*255*255*endlip[0]
      +255*255*endlip[1]
      +255*endlip[2]
      +endlip[3];
  }
        else if(DivideIP(stemp2.c_str(),endlip,endsip))
        {
            endiplong=255*255*255*endlip[0]
                     +255*255*endlip[1]
                     +255*endlip[2]
                     +endlip[3];

  }
        endiplong=ValidLongIP(endiplong);
        startiplong=ValidLongIP(startiplong);
        totalipnum=endiplong-startiplong+1;

        if(totalipnum>0)
        {
   //初始化成功
   curipnum=1;
   curiplong=startiplong;
   for(i=0;i<4;i++)
   {
    curlip[i]=startlip[i];
    cursip[i]=startsip[i];
   }
            InitOK=true;           
  }
        else
  {               
   //IP组可用个数为0,重新初始化
   startiplong=0;
   endiplong=0;
   curiplong=0;
   tempiplong=0;

   totalipnum=0;
   curipnum=0;

   for(i=0;i<4;i++)
   {
    startlip[i]=0;
    startsip[i]="";

    endlip[i]=0;
    endsip[i]="";

    curlip[i]=0;
    cursip[i]="";

    tempsip[i]="";
    templip[i]=0;
   }    
   InitOK=false;           
  }
    }
}

SunxyIPGroup::~SunxyIPGroup()
{
}

string SunxyIPGroup::GetNextIP(const char* curip="",int offset=1)
{
    string stemp(curip);
    if(InitOK)
    {
        //add codes here
  if(offset>=0)
  {
   if(stemp.empty ())
   {
    tempiplong=curiplong;
    curiplong+=offset;
    curiplong=ValidLongIP(curiplong);
    if(tempiplong==curiplong)
     return "";
    curipnum+=curiplong-tempiplong;    
    stemp=AssembleIP(curiplong,curlip,cursip);
   }
   else
   {   
    if(DivideIP(stemp.c_str (),curlip,cursip))
    {
     curiplong=255*255*255*curlip[0]
        +255*255*curlip[1]
        +255*curlip[2]
        +curlip[3];
     tempiplong=curiplong;
     curiplong+=offset;
     curiplong=ValidLongIP(curiplong);
     if(tempiplong==curiplong)
      return "";
     curipnum+=curiplong-tempiplong;
     stemp=AssembleIP(curiplong,curlip,cursip);
    }
   }
  }
    }
    return stemp;
}

string SunxyIPGroup::GetFirstIP()
{
    string stemp;
    stemp="";
    if(InitOK)
    {
        //add codes here
  stemp=AssembleIP(startiplong,templip,tempsip);
    }
    return stemp;
}
string SunxyIPGroup::GetLastIP()
{
    string stemp;
    stemp="";
    if(InitOK)
    {
        //add codes here
  stemp=AssembleIP(endiplong,templip,tempsip);
    }
    return stemp;
}
unsigned long SunxyIPGroup::TotalIPNum()
{
    if(InitOK)
        return totalipnum;
    return 0;
}
unsigned long SunxyIPGroup::CurIPNum()
{
    if(InitOK)
        return curipnum;
    return 0;
}

unsigned long SunxyIPGroup::GetFirstIPLong()
{
 if(InitOK)
  return startiplong;
 return 0;
}

unsigned long SunxyIPGroup::GetLastIPLong ()
{
 if(InitOK)
  return endiplong;
 return 0;
}

string SunxyIPGroup::GetCurIP ()
{
 if(InitOK)
  return AssembleIP(curiplong,curlip,cursip);
 return "";
}

unsigned long SunxyIPGroup::GetCurIPLong()
{
 if(InitOK)
  return curiplong;
 return 0;
}

//私有函数定义
bool SunxyIPGroup::DivideIP(const char* inputip,unsigned long* inputlip,string* inputsip)
{
   
    string stemp(inputip);
    bool result=false;
    int index;
    int count=0;
    long ipvalue=-1;
    if(!stemp.empty())
    {
        index=stemp.find(".");
        while(count<=3&&index>0)
        {   inputsip[count]=stemp.substr(0,index);
            ipvalue=atol(inputsip[count].c_str());
   //templip[i]=strtoul(tempsip[i].c_str());此函数用法还未查清
            if(index<stemp.length()-1&&ipvalue>=0&&ipvalue<255)
            {
                inputlip[count]=ipvalue;
                count++;
            }
            else
            {
                return result;
            }
            stemp=stemp.substr(index+1,stemp.length()-1-index);
            index=stemp.find(".");
        }
        ipvalue=atol(stemp.c_str());
  //templip[i]=strtoul(tempsip[i].c_str());此函数用法还未查清
        if(ipvalue>=0&&ipvalue<255)
        {
            inputsip[count]=stemp;
            inputlip[count]=ipvalue;
            count++;
        }
        if(count==4)
            result=true;
    }
    return result;
}

string SunxyIPGroup::AssembleIP(unsigned long inputip,unsigned long* inputlip,string* inputsip)
{
    string stemp;
    stemp="";
 int i;
    if(InitOK)
    {
  inputip=ValidLongIP(inputip);
  inputlip[0]=inputip/(255*255*255);
  inputip%=255*255*255;
  inputlip[1]=inputip/(255*255);
  inputip%=255*255;
  inputlip[2]=inputip/255;
  inputip%=255;
  inputlip[3]=inputip;
  for(i=0;i<4;i++)
  {
   char ctemp[8];
   inputsip[i]=string(ltoa(inputlip[i],ctemp,10));
   stemp=stemp+inputsip[i]+".";
  }
  stemp=stemp.substr (0,stemp.length ()-1);
  
    }
    return stemp;
}

unsigned long SunxyIPGroup::ValidLongIP(unsigned long inputip)
{
     if(inputip>endiplong)
   inputip=endiplong;
  if(inputip<startiplong)
   inputip=startiplong;
  if(inputip%255==0)
         inputip++;
  return inputip;
}
#endif

//---------------------------------ipgroup.h结束---------------------------------

演示程序:

//-------------------------------文件名:ipgrouptest.cpp--------------------------------

#include <iostream>
#include <stdlib.h>
#include "ipgroup.h"
int main(int argc,char* argv[])
{
 SunxyIPGroup ipgroup("192.168.1.1","192.168.1.200");
 cout<<"The ip group is next:"<<endl
  <<ipgroup.GetFirstIP()<<endl;
 while(ipgroup.GetCurIP()!=ipgroup.GetLastIP())
 { 
  cout<<ipgroup.GetNextIP(ipgroup.GetCurIP().c_str())<<endl;
 }
 cout<<"-----end-----"<<endl;
 system("pause");
 return 0;
}
//--------------------------------ipgrouptest.cpp结束--------------------------------------------

### 回答1: 正如你所知,Unity使用TCP协议来传输数据。它使用TCP/IP协议,可以在多台计算机之间进行安全通信,从而为网络游戏提供全面支持。TCP/IP可以帮助确保网络通信的完整性,同时还可以防止数据包丢失,从而提高网络游戏的效率和稳定性。 ### 回答2: Unity 使用TCP 可以实现网络通信功能,实现客户端和服务器之间的数据交互。下面是一个示例代码,实现了一个简单的服务器和客户端的连接和数据传输。 在 Unity 中使用 TcpClient 和 TcpListener 类来实现 TCP 连接。首先,我们需要在客户端中创建一个 TcpClient 对象,并指定服务器的 IP 地址和端口号。然后,通过 TcpClient 的 GetStream 方法获取网络流,通过流进行数据的读操作。 在服务器端,我们需要使用 TcpListener 类来设定监听指定端口,并通过 AcceptTcpClient 方法来等待客户端的连接请求。一旦有客户端连接,我们就可以通过返回的 TcpClient 对象来和客户端进行数据交互。 客户端示例代码如下: ```csharp using UnityEngine; using System; using System.Net.Sockets; public class TcpClientTest : MonoBehaviour { TcpClient client; NetworkStream stream; byte[] data; void Start() { try { // 创建 TcpClient 对象并连接服务器 client = new TcpClient("127.0.0.1", 8888); // 获取网络流 stream = client.GetStream(); // 发送数据 string message = "Hello from client!"; data = System.Text.Encoding.UTF8.GetBytes(message); stream.Write(data, 0, data.Length); // 接收数据 data = new byte[1024]; int bytes = stream.Read(data, 0, data.Length); string responseData = System.Text.Encoding.UTF8.GetString(data, 0, bytes); Debug.Log("Received: " + responseData); } catch (Exception e) { Debug.Log(e.ToString()); } finally { // 关闭连接 stream.Close(); client.Close(); } } } ``` 服务器端示例代码如下: ```csharp using UnityEngine; using System; using System.Net; using System.Net.Sockets; public class TcpServerTest : MonoBehaviour { TcpListener server; TcpClient client; NetworkStream stream; byte[] data; void Start() { try { // 设定监听端口 server = new TcpListener(IPAddress.Any, 8888); // 开始监听 server.Start(); Debug.Log("Server started!"); // 等待客户端连接 client = server.AcceptTcpClient(); Debug.Log("Client connected!"); // 获取网络流 stream = client.GetStream(); // 接收客户端发送的数据 data = new byte[1024]; int bytes = stream.Read(data, 0, data.Length); string requestData = System.Text.Encoding.UTF8.GetString(data, 0, bytes); Debug.Log("Received: " + requestData); // 发送响应数据给客户端 string responseMessage = "Hello from server!"; data = System.Text.Encoding.UTF8.GetBytes(responseMessage); stream.Write(data, 0, data.Length); } catch (Exception e) { Debug.Log(e.ToString()); } finally { // 关闭连接 stream.Close(); client.Close(); server.Stop(); } } } ``` 以上就是使用 Unity 实现 TCP 连接的简单示例代码。在实际开发中,你可以根据需求进一步完善和扩展这些代码,实现更复杂的功能。 ### 回答3: Unity提供了一个强大的网络功能,可以使用TCP协议进行网络通信。下面是使用TCP在Unity中进行网络通信的简单示例: 首先,需要在Unity中创建一个脚本,在该脚本中编与TCP通信相关的代码。我们可以使用C#的Socket类来进行网络通信。首先,需要引入System.Net.Sockets命名空间。 然后,声明一个Socket对象,并设置其相关参数,如IP地址和端口号。例如,可以使用以下代码: ``` using System.Net.Sockets; public class TCPClient : MonoBehaviour { private Socket clientSocket; private void Start() { clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 设置服务器的IP地址和端口号 IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); int port = 8888; // 连接服务器 clientSocket.Connect(new IPEndPoint(ipAddress, port)); } private void Update() { // 在Update函数中可以进行TCP通信的相关操作,比如发送和接收消息 // 例如,发送消息给服务器 string message = "Hello, server!"; byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); // 接收服务器的响应 byte[] buffer = new byte[1024]; int count = clientSocket.Receive(buffer); string response = Encoding.UTF8.GetString(buffer, 0, count); Debug.Log("Server response: " + response); } private void OnDestroy() { // 关闭Socket连接 clientSocket.Close(); } } ``` 在Start函数中,在脚本启动时,创建一个Socket对象,并设置服务器的IP地址和端口号。然后,在Update函数中,可以调用clientSocket.Send方法发送消息给服务器,并通过clientSocket.Receive方法接收服务器的响应。 在OnDestroy函数中,关闭Socket连接。 需要注意的是,以上代码只是一个简单的示例,实际使用中可能需要考虑网络错误处理、数据包拆分和组装等更复杂的逻辑。但这段代码可以作为学习和入门TCP通信的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值