UDP的使用
//
// 该类管理所有的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的使用的更多相关文章
- Node.js:dgram模块实现UDP通信
		1.什么是UDP? 这里简单介绍下,UDP,即用户数据报协议,一种面向无连接的传输层协议,提供不可靠的消息传送服务.UDP协议使用端口号为不同的应用保留其各自的数据传输通道,这一点非常重要.与TCP相 ... 
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1
		HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ... 
- TODO:Golang语言TCP/UDP协议重用地址端口
		TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ... 
- 利用Docker技术实现UDP广播效果(网络编程python版)
		docker的安装见官方文档 我使用的系统为Ubuntu16.04 Ubuntu系统安装docker文档地址:https://docs.docker.com/engine/installation/l ... 
- 【Win 10 应用开发】UDP广播
		我们知道,对于UDP协议的通信,除了可以用来聊天外,可以发送广播数据.只要向广播地址的某个端口发送数据就可以进行广播,子网中只要监听该端口的socket就能收到广播消息. 最简单的方法就是向255.2 ... 
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.2
		HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ... 
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.0.1
		HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ... 
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3
		HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ... 
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2
		HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ... 
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1
		HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ... 
随机推荐
- C# cmd执行命令
			CMD命令执行 ///<summary> /// cmd命令执行,在cmd上可以执行的语句,直接传到这里,调用grads画图实例如下: /// Cmd(& ... 
- IT技术学习指导之Linux系统入门的4个阶段(纯干货带图)
			IT技术学习指导之Linux系统入门的4个阶段(纯干货带图) 全世界60%的人都在使用Linux.几乎没有人没有受到Linux系统的"恩惠",我们享受的大量服务(包括网页服务.聊天 ... 
- 如何查询postgresql+openstreetmap
			先行输入:psql gis \d 显示当前数据表 List of relations Schema | Name | Type | Owner --------+------------------- ... 
- Codeforces Round #211 (Div. 2) D题(二分,贪心)解题报告
			---恢复内容开始--- 题目地址 简要题意: n个小伙子一起去买自行车,他们有每个人都带了一些钱,并且有公有的一笔梦想启动资金,可以分配给任何小伙子任何数值,当然分配权在我们的手中.现在给出m辆自行 ... 
- Zend_Frameowrk中进行多语言国际化的相关的配置和使用
			在使用Zend_Framework建立网站,若网站在以后的使用中面向国际,这时就需要实现网站的多语言国际化问题.使用Zend_Framework开发的网站需要进行多语言的开发时,就需要用到了Zend_ ... 
- rocksDB 安装问题简单介绍
			前一段时间准备测试rocksdb,按照帖子和官网的例子,在安装过程中遇到一些问题.这里给出的是在Ubuntu下安装python使用的版本. 首先,要感谢这些帖子对我的帮助: 1:http://tech ... 
- WPF 调用WinForm控件
			WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置win ... 
- 循序渐进redis(一) ——  redis的安装及可视化工具的使用
			1.安装 注意事项: 1.安装gcc 2.编译带参数: make MALLOC=libc 2.可视化客户端工具 推荐使用RedisClient,提供了基本的CRUD以及过期设置等操作的图形化接口,在项 ... 
- 设置Windows 7 防火墙端口规则
			http://jingyan.baidu.com/article/c843ea0b7d5c7177931e4ab1.html?qq-pf-to=pcqq.c2c 主要解决手机访问pc站点的问题(pc和 ... 
- 使用ISO文件安装Linux
			一. 准备知识 1. ISO文件 我们普遍使用的ISO文件是指包含着整个CD-ROM(ISO-9660 文件系统)内容的 映象, 是整个碟片从0扇区到最后一个扇区的完整复制,经常被用来在网络上传输 对 ... 
