这是一个使用C++封装的TCP/IP协议栈(仅传输层),属于本人所设计的中间件的一员,具有硬件无关,应用无关特性,使用非常方便,一看代码便知:
1 #include "net.h" // 包含这个net.h就可以使用所有TCP/IP中间件的以下4个功能 2 3 TcpClient tcpc1; // 定义一个TCP客户端,用于主动连接目标主机 4 TcpListener tcpl1; // 定义一个TCP服务端,用于侦听来自远程主机的连接 5 Socket socket1; // 定义一个符合Berkeley套接字标准的socket 6 UdpClient udp1; // 定义一个UDP客户端
7 // 测试TCP客户端 8 void TestTcpClient(void){ 9 tcpc1.Init(“192.168.1.120”,12000); // 建立默认远程主机 10 tcpc1.Connect(); // 连接,任务将阻塞,连接成功或连接超时返回,.Connect(3000)表示3秒超时,无参数表示不超时 11 tcpc1.Send("Hello, TcpClient !\n"); 12 tcp1.Close(); // 关闭连接 13 }
14 // 测试TCP服务端 15 void TestTcpListener(void){ 16 int len; 17 byte rxbuf[1460]; 18 tcpl1.Init(11000); // 将本程序表示为11000端口 19 tcpl1.Start(); // 开始异步侦听 20 while(true){ 21 len = tcpl1.rxStream.GetNewLine(rxbuf,sizeof(rxbuf)); // 读数据,接收成功返回长度,否则返回0 22 if(len){ 23 tcpl1.Send(“\n接收到:”) 24 tcpl1.Send(rxbuf,len); // 将接收到的数据发回 25 } 26 } 27 tcp1.Close(); // 关闭连接,示意性代码 28 }
29 // 测试socket 30 void TestSocket(void){ 31 socket1.Init(SOCK_STREAM,0); // 使用流协议,也可以使用数据报协议SOCK_DGRAM 32 socket1.Connect(“192.168.1.120”,12000); 33 socket1.Send("Hello, Socket !\n"); 34 socket1.Close(); 35 // 另外还有Bind与Listen函数可用于侦听连接 36 } 37 // 测试UDP 38 void TestUDP(void){ 39 int len; 40 char* rxbuf; 41 EndPoint* remoteEP; // 用于存储远程地址 42 udp1.Init(12001); // 适用于接收 43 //udp1.Init(“192.168.1.120”,11001); // 适用于发送 44 udp1.ReceQueueInit(1024); // 初始化接收队列,1024字节,如果没有此句,一次只能接收一个包 45 // 如果使用接收队列,接收可在后台完成,前台慢慢处理,不丢包 46 udp1.Open(); // 打开端口 47 48 remoteEP = new EndPoint; // 使用动态分配,该动态内存分配算法是中间件的一部分 49 rxbuf = new char[512]; 50 while(1) 51 if(udp1.IsReceived()){ 52 memset(rxbuf,0,512); 53 len = udp1.ReceiveFrom(rxbuf,512,remoteEP); 54 if(len){ 55 // 打印消息内容,长度,发送者IP地址,发送者端口 56 ComPrintf("msg = %s,len = %l,for:ip=%d.%d.%d.%d,port=%l\n", 57 rxbuf, 58 len, 59 remoteEP->Address.bytes[0], 60 remoteEP->Address.bytes[1], 61 remoteEP->Address.bytes[2], 62 remoteEP->Address.bytes[3], 63 remoteEP->Port); 64 } 65 } 66 } 67 delete remoteEP; 68 } 69 // 需要在第一个任务调用NetInit()函数即可启动网络服务
只需一个库文件与一个头文件以及一个硬件相关的驱动文件再加上一个配置文件即可使用,配置文件图形化操作:
这样项目就可以轻松使用网络连接功能了!