A手机等的网络udp广播,收到广播以后回复udp消息

B手机:向A手机发送一条消息,等待A回复

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [self broadCast];
    
    return YES;
}

- (IBAction)broadCast {
    GCDAsyncUdpSocket *udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    
    NSError *error = nil;
    [udpSocket enableBroadcast:YES error:&error];//允许广播 必须 否则后面无法发送组播和广播
    NSString *message = @"{\"type\":49}";
    //[udpSocket sendData:[message dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:10];//该函数只能用户已经连接的socket
    [udpSocket sendData:[message dataUsingEncoding:NSUTF8StringEncoding] toHost:@"192.168.1.102"   port:8400 withTimeout:-1 tag:10];//客户端socket发送组播或是广播 根据host的ip地址来订
    [udpSocket beginReceiving:nil];//必须要  开始准备接收数据
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
      fromAddress:(NSData *)address
withFilterContext:(id)filterContext {
    NSLog(@"ReceiveData = %@, fromAddress = %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding],[[NSString alloc] initWithData:address encoding:NSUTF8StringEncoding]);
    NSString *host = nil;
    uint16_t port = 0;
    [GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];//从此可以获取服务端回应的ip和端口 用于后面的tcp连接
     NSLog(@"Adress = %@ %i",host,port);
    
}

A手机建立udp监听,收到消息后回复:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [self startReciveUdpBroadcast:udpSocket8400 port:8400];
    
    return YES;
}

- (void)startReciveUdpBroadcast:(GCDAsyncUdpSocket *)aUdpSocket port:(int)port
{
     if (aUdpSocket == nil)
    {
        aUdpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
        NSError *error = nil;
        
        if (![aUdpSocket bindToPort:port error:&error])
        {
            NSLog(@"udpSocket Error binding: %@", error);
            return;
        }
        if (![aUdpSocket beginReceiving:&error])
        {
            NSLog(@"udpSocket Error receiving: %@", error);
            return;
        }
        
        NSLog(@"start Receive Broadcast:%@============== ,%d",aUdpSocket,port);
        
        [aUdpSocket enableBroadcast:YES error:&error];

}
   
    if(port == 8400)
    {
        udpSocket8400 = aUdpSocket;
    }
   }

#pragma mark- GCDAsyncUdpSocketDelegate
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext
{      
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
      NSLog(@"udp receive data 49 %@", msg);
        
        NSString *host = nil;
        uint16_t port = 0;
        [GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];
        //可获取客户端socket的ip和端口,不过直接打印address是空的
        NSLog(@"Adress = %@ %i",host,port);

//服务端回应客户端                   
        NSString *jsonString = @"回复的消息" ;   
        [sock sendData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] toAddress:address withTimeout:-1 tag:10];

}
   
   
}

时间: 2024-10-09 23:59:51

A手机等的网络udp广播,收到广播以后回复udp消息的相关文章

赵雅智_java网络编程(5)TCP和udp区别

1.TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性; 而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的.不可靠的一种数据传输协议. 2.也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好. 知道了TCP和UD

android 4.0.3开机时不能收到广播

====================问题描述==================== 在android 4.0.3的手机上,receiver在手机开机后收不到启动广播,代码如下: 配置文件:   <receiver android:name=".Boot_test" >         <intent-filter  >              <action android:name="android.intent.action.BOOT

UDP 收/发 广播包

网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用过程: 1. 初始化网络库 2. 创建SOCK_DGRAM类型的Socket. 3. 绑定套接字. 4. 发送.接收数据. 5. 销毁套接字. 6. 释放网络库. 广播数据包的原理: 专门用于同时向网络中所有工作站进行发送的一个地址叫做广播地址.在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的

UNP(一):网络编程角度下的TCP、UDP协议

此博文是学习UNP(UNIX Network Programming)后的读书笔记,供以后自己翻阅回顾知识. TCP.UDP概述 在前面<计算机网络与TCP/IP>栏目下已经介绍过一些关于TCP.UDP的相关知识TCP/IP(三):传输层TCP与UDP,这里只是简单从UNIX网络编程的角度介绍TCP.UDP协议. 我们都知道UDP 缺乏可靠性.无连接的,面向数据报 的协议,如果想确保数据报到达目的地,必须自己在应用层实现一些特性:对端的确定.本端的超时和重传等.UDP面向报文的特性,使得UDP

[转帖]关于网络编程中MTU、TCP、UDP优化配置的一些总结

https://www.cnblogs.com/maowang1991/archive/2013/04/15/3022955.html 感谢原作者的内容. 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层.  其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在应用层 它们的关系是 数据帧{IP包{TCP或UDP包{Data}}} ------------------------------------

NetworkInfo 手机中的网络类型

04-27 21:56:54.442: E/NetworkInfo(26457): NetworkInfo: type: mobile[EDGE], state: DISCONNECTED/IDLE, reason: (unspecified), extra: (none), roaming: false, failover: true, isAvailable: false;ni.typename=mobile 04-27 21:56:54.442: E/NetworkInfo(26457):

android手机设置虚拟网络的步骤

上个周五参加麦子学院班会的时候,android开发老师葛老师讲到android手机设置虚拟网络的问题,她说在android手机使用中,经常会需要设置虚拟网络,下面我就给大家回顾一下麦子学院android开发老师讲的虚拟网络的设置,来看看具体设置步骤: 第一步,打开手机主菜单,选择"设置",然后选择"无线和网络" 第二步:选择"虚拟专用网设置" 第三步:选择"添加虚拟专用网" 第四步:选择"添加L2TP/IPSec P

UNIX 网络编程笔记-CH2:TCP、UDP概貌

好久不读不用又忘得差不多了,还是感叹Richard Stevens真是太刁,25年前第一版. "Tcp state diagram fixed new" by Scil100. Licensed under CC BY-SA 3.0 via Wikimedia Commons - http://commons.wikimedia.org/wiki/File:Tcp_state_diagram_fixed_new.svg#/media/File:Tcp_state_diagram_fix

关于网络编程中MTU、TCP、UDP、IP

名词解释: MTU(Maxium Transmission Unit)最大传输单元 TCP (Transmission Control Protocal)传输控制协议 UDP (Usage Datagram Protocal)用户数据报协议 IP (Internet Protocal) 因特网协议 TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层(TCP/IP是一个协议簇,并不是代表TCP协议和IP协议) 以太网(Ethemet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传