//

//  该类管理所有的UDP发送

#import <Foundation/Foundation.h>

#import "AsyncUdpSocket.h"

@protocolUDPManagerDelegate;

#define fromHostKey @"fromHost"

#define dataKey @"data"

#define socketTypeKey @"socketType"

#define errorTypeKey @"error"

typedefenum{

NewDevice=0x01,//设备发现

AddDevice=0x02,//添加设备

ControlDevice=0x11,//控制设备

//    TimeQuery=0xFD,//查询定时状态

}SocketNotificationType;

@interface UDPManager : NSObject

{

AsyncUdpSocket *udpSocket;

}

+(UDPManager *)instance;

@property(nonatomic,strong) id<UDPManagerDelegate>myDelegate;

//发送UDP信息 isBroadcast为发送的消息是否为广播类型

-(void)sendToUDPServer:(NSData*) msg address:(NSString*)address port:(int)port isBroadcast:(BOOL)isBoradcast;

//关闭Socket

-(void)closeSocket;

@end

@protocol UDPManagerDelegate <NSObject>

//成功接收消息

-(void)UDPManager:(UDPManager *)udpManager didReceiveData:(NSData *)data fromHost:(NSString *)host socketDataType:(SocketNotificationType)type;

//UDP发送或接收失败

-(void)UDPManagerReceive:(UDPManager *)udpManager error:(NSError *)error;

@end

//

//  UDPManager.m

//  SmartHomeWIFI

//

//  Created by 深圳市 秀软科技有限公司 on 14-2-12.

//  Copyright (c) 2014年 huhuaxiang. All rights reserved.

//

//wifi获取网路数据

#import "UDPManager.h"

#import "ByteUnit.h"

#define timerOut 5

static UDPManager *udpManager;

@implementation UDPManager

@synthesize myDelegate;

+(UDPManager *)instance

{

if(!udpManager)

udpManager=[[UDPManageralloc]init];

returnudpManager;

}

-(id)init

{

if(self=[superinit])

{

udpSocket=[[AsyncUdpSocketalloc]initWithDelegate:self];

[udpSocket bindToPort:36666 error:nil];

}

returnself;

}

-(void)dealloc

{

NSLog(@"UDPManager dealloc");

}

-(void)closeSocket

{

[udpSocketclose];

udpSocket=nil;

udpManager=nil;

}

-(void)sendToUDPServer:(NSData*) msg address:(NSString*)address port:(int)port isBroadcast:(BOOL)isBoradcast{

NSLog(@"address:%@,port:%d,msg:%@",address,port,msg);

//receiveWithTimeout is necessary or you won't receive anything

//    [udpSocket receiveWithTimeout:10 tag:0]; //设置超时10秒

//命令标示

unsignedlong mlflag = [ByteUnitsubDataLength:msg startCount:0lenghtCount:1];

SocketNotificationType type=[selfgetTagType:mlflag];

[udpSocketreceiveWithTimeout:timerOuttag:0]; //设置超时10秒

[udpSocketenableBroadcast:isBoradcast error:nil]; //如果你发送广播,这里必须先enableBroadcast

[udpSocket sendData:msg toHost:address port:port withTimeout:timerOut tag:type]; //发送udp

}

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port

{

//    NSMutableData *dataMutable=[[NSMutableData alloc]initWithData:data];

//命令标示

unsignedlong mlflag = [ByteUnitsubDataLength:data startCount:0lenghtCount:1];

SocketNotificationType type=[selfgetTagType:mlflag];

NSMutableDictionary *dic=[[NSMutableDictionaryalloc]init];

[dic setObject:data forKey:dataKey];

[dic setObject:host forKey:fromHostKey];

[dic setObject:[NSNumbernumberWithInt:type] forKey:socketTypeKey];

[[NSNotificationCenterdefaultCenter] postNotificationName:updateSocketNotificationTypeobject:dic];

//    if([myDelegate respondsToSelector:@selector(UDPManager:didReceiveData:fromHost:socketDataType:)])

//        [myDelegate UDPManager:self didReceiveData:data fromHost:host socketDataType:type];

//    [udpSocket receiveWithTimeout:timerOut tag:tag];

returnYES;

}

-(SocketNotificationType)getTagType:(int)mlflag

{

SocketNotificationType type;

switch (mlflag) {//回复类型

case 0x01://心跳

type=NewDevice;

break;

case 0x02://添加设备

type=AddDevice;

break;

case 0x11://控制设备

type=ControlDevice;

break;

//        case 0xFD://查询定时

//            type=TimeQuery;

//            break;

}

return type;

}

- (void)onUdpSocket:(AsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error

{

NSMutableDictionary *dic=[[NSMutableDictionaryalloc]init];

[dic setObject:[NSNumbernumberWithInt:tag] forKey:errorTypeKey];

[[NSNotificationCenterdefaultCenter] postNotificationName:updateSocketNotificationTypeobject:dic];

//    if([myDelegate respondsToSelector:@selector(UDPManagerReceive:error:)])

//        [myDelegate UDPManagerReceive:self error:error];

}

- (void)onUdpSocket:(AsyncUdpSocket *)sock didNotReceiveDataWithTag:(long)tag dueToError:(NSError *)error

{

NSMutableDictionary *dic=[[NSMutableDictionaryalloc]init];

[dic setObject:[NSNumbernumberWithInt:tag] forKey:errorTypeKey];

[[NSNotificationCenterdefaultCenter] postNotificationName:updateSocketNotificationTypeobject:dic];

//    if([myDelegate respondsToSelector:@selector(UDPManagerReceive:error:)])

//        [myDelegate UDPManagerReceive:self error:error];

}

@end

UDP的使用的更多相关文章

  1. Node.js:dgram模块实现UDP通信

    1.什么是UDP? 这里简单介绍下,UDP,即用户数据报协议,一种面向无连接的传输层协议,提供不可靠的消息传送服务.UDP协议使用端口号为不同的应用保留其各自的数据传输通道,这一点非常重要.与TCP相 ...

  2. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  3. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  4. 利用Docker技术实现UDP广播效果(网络编程python版)

    docker的安装见官方文档 我使用的系统为Ubuntu16.04 Ubuntu系统安装docker文档地址:https://docs.docker.com/engine/installation/l ...

  5. 【Win 10 应用开发】UDP广播

    我们知道,对于UDP协议的通信,除了可以用来聊天外,可以发送广播数据.只要向广播地址的某个端口发送数据就可以进行广播,子网中只要监听该端口的socket就能收到广播消息. 最简单的方法就是向255.2 ...

  6. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.2

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  7. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.0.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  8. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  9. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  10. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

随机推荐

  1. JVM 虚拟机 内存说明

    Java虚拟机所管理的内存图: 1程序计数器: 该模块作用是记录线程执行字节码的位置,记录程序执行状态,以便该线程下次获得CPU时继续执行.程序里的每个线程程序计数器相互独立,互不影响,该内存区也称“ ...

  2. IOS开发_中遍历数组的方法及比较

    数组,做为一种常用的数据类型,频繁出现在编码中,其中肯定少不了对数组的遍历,本博文对数组遍历,进行一下自己的归纳,如果是大牛,一笑而过就好,互相学习,欢迎指正. 话不多说直接进入主题 首先创建一个数组 ...

  3. c语言函数, 函数调用及函数递归

    1. 函数的定义: 返回值类型 函数名(形参列表) {函数体(函数的实现内容)}, 注意: 如果没有参数, 小括号也是必不可少的.  函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函 ...

  4. 【Python③】python基本数据类型,变量和常量

    基本数据类型 Python中,能直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,包括负整数,程序中的写法和数学上的一样,例如:6,-666,8888…… 计算机使用二进制,所 ...

  5. 高性能javascript(记录三)

    DOM(文档对象模型)是一个独立的语言,用于操作XML和HTML文档的程序接口(API).在游览器中,主要用来与HTML文档打交道,同样也用在Web程序中获取XML文档,并使用DOM API用来访问文 ...

  6. js只保留整数,向上取整,四舍五入,向下取整等函数

    1.丢弃小数部分,保留整数部分 parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3.四舍五入. Math.round(5/2) 4.向下取整 Math.f ...

  7. JavaScript 闭包系列一

    一. 闭包的概念 闭包是有权访问另一个函数作用域中的变量的函数. 如下代码:根据变量作用域,函数outer中所有的局部变量对函数inner都是可见的.但是反过来不行,inner内部的局部变量对oute ...

  8. SAE使用心得1

    最近准备在新浪云端SAE上挂点自己的小网站,这样自己开发个什么东西别人能用.但是第一次接触SAE,遇到一些问题,记下来给大家看. 1.安装的svn版本不能高于 1.8,否则无法向SAE提交代码. 2. ...

  9. android开发-mvp模式理解

    看之前,先忘掉所有,一步步看就行了. 最后会有一个原型demo,当然是转的了.看完文章,再看demo,然后再回头看文章就很好理解了,最好自己写一遍. 1.mvp开发模式可以理解为页面接口编程,每一层的 ...

  10. Linux 命令 find

    find命令的基本格式是:find [路径] [选项] [操作]路径是find命令所查找的范围,如用.来表示当前目录,用/来表示根目录,选项用于指定查找条件,如:可以指定按照文件的属主,更改时间文件类 ...