天道酬勤,学无止境

set max packet size for GCDAsyncUdpSocket

I am using the GCDAsyncUdpSocket to send/receive data to a multicast group. In the GCDAsyncUdpSocket.m file, I found the setting bellow and changed the value to 32768 for example. But I can't still receive any packet that is larger than 9216 bytes.

max4ReceiveSize = 9216;
max6ReceiveSize = 9216;

Is there another setting?

Edit: I discovered that the GCDAsyncUdpSocket class did provide a method to set this value called setMaxReceiveIPv4BufferSize. Tried that but it still only received at around 9216 bytes.

评论

It would help to know exactly which operating system you are on, as the settings vary. On OS X 10.6, look at:

# sysctl net.inet.udp.maxdgram
net.inet.udp.maxdgram: 9216

However, you must keep in mind that the maximum transmit unit (MTU) of any data path will be determined by the smallest value supported by any device in the path. In other words, if just one device or software rule refuses to handle datagrams larger than a particular size, then that will be the limit for that path. Thus there could be many settings on many devices which affect this. Also note that the MTU rules for IPv4 and IPv6 are radically different, and some routers have different rules for multicast versus unicast.

In general, it is not safe to assume that any IP datagram larger than a total of 576 bytes (including all protocol headers) will be allowed through, as 576 the maximum IP packet size which IPv4 guarantees will be supported. For IPv6, the guaranteed size is 1280. Most devices will support larger packets, but they are not required to.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • iOS上的GCDAsyncUdpSocket缺少多播数据报(GCDAsyncUdpSocket on iOS missing multicasted datagrams)
    问题 我在网络上有一台设备正在通过UDP多播一个很小的文件。 我正在开发的iOS应用负责读取这些数据包,因此我选择使用GCDAsyncUdpSocket进行操作。 该文件每半秒发送一次,但是我却没有那么频繁地收到它(仅每3-10秒接收一次)。 考虑到这可能是设备的问题,我开始使用Wireshark监视流量。 这似乎反映了我在应用程序中看到的内容,直到我在Wireshark中启用“监视器模式”为止,这时每个UDP数据包均被捕获。 另外,由于iOS模拟器与我正在开发的Mac共享NIC,因此iOS模拟器开始接收所有丢失的数据包。 有没有一种方法可以在iOS设备上启用“监视器模式”,或者我所缺少的东西可以允许丢失的数据包进入? 我还看到GCDAsyncUdpSocket中有一个readStream方法。 也许我需要使用它而不是beginReceiving? 虽然我不知道在这种情况下如何在Objective-C中设置流。 这是我现在的测试代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSLog(@"View Loaded"); [self setupSocket]; } - (void
  • UDP broadcast using GCDAsyncUdpSocket through all available Network Interfaces
    I am using GCDAsyncUdpSocket for broadcasting UDP packets for searching my NAS devices. Below is the code snippet for sending and receiving UDP packets NSString *broadCastAddress = @"255.255.255.255"; NSInteger udpPort = 8097; GCDAsyncUdpSocket *gcdAsyncUdpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:selfdelegateQueue:dispatch_get_main_queue()]; [gcdAsyncUdpSocket bindToPort:udpPort error:&error]; [gcdAsyncUdpSocket setPreferIPv4]; NSData *data = @“Hi there”; // Sample data [gcdAsyncUdpSocket enableBroadcast:YES error:&error]; [gcdAsyncUdpSocket beginReceiving:&error];
  • 从 iPhone 通过 udp 发送“Hello World”消息(Send “Hello World” message via udp from iPhone)
    问题 我是目标 C 的新手,我需要通过 UDP 发送一条简单的消息。 服务器部分正在工作,因为它是用 C# 实现的。 C#中的服务器代码是: var server = new UdpClient(8585); var groupEP = new IPEndPoint(IPAddress.Parse("192.168.0.120"),8585); byte[] bytes = server.Receive(ref groupEP); c# 中的客户端部分是: System.Net.Sockets.UdpClient client; client = new System.Net.Sockets.UdpClient("192.168.0.120",8585); client.Send(new byte[]{1,2,3,4},4); 如何在目标 c 中执行相同的客户端部分? 我知道互联网上有很多教程,例如这个库。 当我将该库导入我的项目时,我不知道如何实例化一个新对象。 我试过了: [[GCDAsyncUdpSocket alloc] initWithSocketQueue:... ??? I don't know how to initialize it. 如果有人可以向我展示如何将客户端部分复制到目标 c 中的简单示例,我将不胜感激。 回答1 从这里下载
  • How to trigger the local network dialog authorization for multicast entitlement using iOS 14
    Following iOS 14 new policy of blocking access to local network, a com.apple.developer.networking.multicast special entitlement is needed to access the local network, and this access should be confirmed by user during an authorization dialog. Although this new feature is not thoroughly documented, Apple engineers have indicated in forums that this authorization dialog popup is only triggered when the app tries to send traffic, causing an issue for apps reading only the network, as indicated in iOS 14 How to trigger Local Network dialog and check user answer? Unfortunately, the advice of
  • 在 Swift 上委托 Objective-C 协议(Delegating Objective-C Protocol on Swift)
    问题 我正在使用 Swift 语言在 iOS 上实现一个 UDP 侦听器。 为此,我正在转播 CocoaAsyncSocket 项目。 我成功地使用 Bridging-Header.h 导入了 CocoaAsyncSocket 库,我可以从 Objective-C 类调用函数,但我无法在 swift 上编写委托函数。 这是我设置 Socket 并将 ViewController.swif 定义为侦听器的委托类的代码: func setupSocket() { var udpSocket : GCDAsyncUdpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) var error : NSError? let port : UInt16 = 12121 let address : String = "228.5.12.12" udpSocket.bindToPort(port, error: &error) udpSocket.joinMulticastGroup(address, error: &error) udpSocket.enableBroadcast(true, error: &error) println("228.5.12.12") } 这是
  • Delegating Objective-C Protocol on Swift
    I'm implementing an UDP Listener on iOS using the Swift language. For this I'm relaying on the CocoaAsyncSocket project. I was succeeded on importing the CocoaAsyncSocket library using a Bridging-Header.h, I could call the functions from the Objective-C classes, but I'm not able to write the delegate function on swift. This is the code where I set the Socket and define the ViewController.swif as the delegate class for the listener: func setupSocket() { var udpSocket : GCDAsyncUdpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) var error : NSError? let port
  • 如何更改max_allowed_pa​​cket大小(How to change max_allowed_packet size)
    问题 我的MySQL数据库中的BLOB字段有问题-上传大于大约1MB的文件时,出现错误消息Packets larger than max_allowed_packet are not allowed. 这是我尝试过的: 在MySQL查询浏览器中,我运行了一个show variables like 'max_allowed_packet' ,它给了我1048576。 然后,我执行查询set global max_allowed_packet=33554432然后执行show variables like 'max_allowed_packet'它给了我33554432预期的效果。 但是,当我重新启动MySQL服务器时,它神奇地回到了1048576。在这里我做错了什么? 额外的问题,是否可以压缩BLOB字段? 回答1 通过在文件的[mysqld]或[client]部分下包含单行,更改my.ini或~/.my.cnf文件: max_allowed_packet=500M 然后重新启动MySQL服务,您就完成了。 请参阅文档以获取更多信息。 回答2 可以通过运行查询来全局设置max_allowed_pa​​cket变量。 但是,如果未在my.ini文件中更改它(如dragon112建议的那样),则即使重新设置服务器,该值也会在服务器重新启动时重置。
  • 通过域套接字传输的单个数据包的大小的实际限制是什么?(What's the practical limit on the size of single packet transmitted over domain socket?)
    问题 让我们假设有一个为典型的服务器-客户端程序创建的Unix域套接字。 客户端通过套接字发送10GB的缓冲区,同时服务器将其占用。 OS(Linux / BSD)是将10GB缓冲区分成许多数据包并发送/使用它们,还是一次发送? 如果无法一次性发送10GB的域套接字缓冲区,那么单个数据包的实际大小限制是多少? 限制条件: 该程序将在Linux 2.6.32+和FreeBSD 9+上运行要发送的缓冲区的大小最大为3个字节,最大为10GB。 回答1 有许多因素将决定可以在Unix套接字上发送的数据包的最大大小: wmem_max套接字发送缓冲区的最大大小内核设置,该设置确定可以使用setsockopt (SO_SNDBUF)设置的发送缓冲区的最大大小。 可以从/proc/sys/net/core/wmem_max读取当前设置,并且可以使用sysctl net.core.wmem_max=VALUE进行设置(将设置添加到/etc/sysctl.conf以使更改在重新引导后永久存在)。 请注意,此设置适用于所有套接字和套接字协议,而不仅适用于Unix套接字。 如果将多个数据包发送到Unix套接字(使用SOCK_DATAGRAM),则可以无阻塞发送的最大数据量取决于套接字发送缓冲区的大小(请参见上文)和Unix上未读数据包的最大数目。套接字(内核参数net.unix.max_dgram
  • MySQL错误2006:mysql服务器已消失(MySQL error 2006: mysql server has gone away)
    问题 我在办公室运行服务器以处理一些文件,并将结果报告给远程MySQL服务器。 文件处理需要一些时间,并且过程中途终止,并出现以下错误: 2006, MySQL server has gone away 我听说过MySQL设置wait_timeout ,但是是否需要在办公室或远程MySQL服务器上更改它? 回答1 检查是否连接并在需要时重新建立连接可能会更容易。 有关此信息,请参见PHP:mysqli_ping。 回答2 我已经遇到过很多次了,通常我发现答案是max_allowed_pa​​cket的默认设置非常低。 通常将其在/etc/my.cnf (在[mysqld] )提高到8或16M。 (MySql 5.7中的默认值为4194304 ,即4MB。) [mysqld] max_allowed_packet=16M 注意:如果该行不存在,只需创建该行 注意:可以在服务器运行时对其进行设置。 使用set global max_allowed_packet=104857600 。 这将其设置为100MB。 回答3 我有同样的问题,但是在[mysqld]下的my.ini/my.cnf文件中更改max_allowed_packet解决问题。 加一行 max_allowed_pa​​cket = 500M 现在restart the MySQL service一旦完成,请restart
  • #2006 MySQL服务器在Wamp中消失了错误(#2006 MySQL Server has gone away error in Wamp)
    问题 我正在使用Wampserver版本2.0。 当我尝试通过MySQL查询浏览器或PHPMyAdmin导入sql文件时,出现以下错误。 Error 2006: MySQL Server has gone away. 该文件的大小为54,528 KB。 在C:\ wamp \ bin \ mysql \ mysql5.1.30 \ my.ini中,我在[mysqldump]和[wampmysqld]中将max_allowed_pa​​cket设置为100M。 我在my.ini中找不到wait_timeout变量。 任何解决此问题的方法吗? 作为参考,我在下面给出了my.ini文件的内容。 # Example MySQL config file for medium systems. # # This is for a system with little memory (32M - 64M) where MySQL plays # an important part, or systems up to 128M where MySQL is used together with # other programs (such as a web server) # # You can copy this file to # /etc/my.cnf to set global
  • MySQL错误1153-收到了一个大于'max_allowed_pa​​cket'字节的数据包(MySQL Error 1153 - Got a packet bigger than 'max_allowed_packet' bytes)
    问题 我正在导入MySQL转储,并收到以下错误。 $ mysql foo < foo.sql ERROR 1153 (08S01) at line 96: Got a packet bigger than 'max_allowed_packet' bytes 显然,数据库中存在附件,这使得插入量非常大。 这是在我的本地计算机上,这是一台从MySQL软件包安装了MySQL 5的Mac。 在哪里更改max_allowed_packet才能导入转储? 还有什么我应该设置的吗? 仅运行mysql --max_allowed_packet=32M …导致相同的错误。 回答1 您可能必须为客户端(您正在运行以执行导入)和正在运行并接受导入的守护程序mysqld进行更改。 对于客户端,可以在命令行上指定它: mysql --max_allowed_packet=100M -u root -p database < dump.sql 另外,更改mysqld部分下的my.cnf或my.ini文件并设置: max_allowed_packet=100M 或者您可以在连接到同一服务器的MySQL控制台中运行以下命令: set global net_buffer_length=1000000; set global max_allowed_packet=1000000000; (对于数据包大小
  • MySQL 中的最大 JSON 列长度(Max JSON column length in MySQL)
    问题 我可以在 MySQL 的 JSON 列中存储的最大字符数是多少? 我在 MySQL 手册中没有看到这一点。 回答1 这是@JorgeLondoño 所谈论内容的演示。 设置服务器的最大允许数据包大小: mysql> set global max_allowed_packet=1024*1024*1024; 退出并再次打开 mysql 客户端,这次设置客户端最大数据包大小匹配: $ mysql --max-allowed-packet=$((1024*1024*1024*)) 创建一个带有 JSON 列的测试表,并用最长的 JSON 文档填充它: mysql> create table test.jtest ( j json ); mysql> insert into test.jtest set j = concat('[', repeat('"word",', 100000000), '"word"]'); Query OK, 1 row affected (1 min 49.67 sec) mysql> select length(j) from test.jtest; +-----------+ | length(j) | +-----------+ | 800000008 | +-----------+ 这表明我能够创建一个包含 1 亿个元素的 JSON 文档
  • com.mysql.jdbc.PacketTooBigException(com.mysql.jdbc.PacketTooBigException)
    问题 我有一个大问题! 当我这样做时: String query = "SELECT * FROM utente WHERE confermato=1 and Username='" + username + "' AND Password='" + password + "'"; Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection con = DriverManager.getConnection("ind_server/nome_db","user","password"); Eclipse给了我这个错误: Packet for query is too large (4739923 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable. 所以,首先:这个查询真的很大吗? -.-之后:我必须在ssh中写哪些命令? 这是我第一次应付这件事! 提前致谢! 我在服务器上没有root特权! 我尝试使用此: mysql>set global max_allowed_packet=32*1024*1024; 但是它给了我这个错误:错误1227(42000):访问被拒绝;
  • 发送QUERY数据包时出错(Error while sending QUERY packet)
    问题 我试图将一些数据插入数据库,但出现此错误“发送QUERY数据包时出错” $insertDeta = $conPat->prepare("insert into table1(data) VALUES(:data)"); $insertDeta->bindParam(':data',$data); $conPat->beginTransaction(); $insertDeta->execute(); $conPat->commit(); 但我认为问题在于数据大小超过16MB。 列的数据类型设置为longtext ,我认为它可以保持4GB的数据大小。 我不知道PDO是否在运行查询或将16MB数据传输到数据库时遇到问题。 多数民众赞成在我可以做的唯一猜测,因为mysql可能会以数据包形式发送数据,而数据包无法保存最大16MB的数据。 回答1 您猜对了,MySQL对数据大小有限制,您需要将查询分解为一小组记录,或者可以使用SET GLOBAL max_allowed_packet=524288000;来更改max_allowed_pa​​cket SET GLOBAL max_allowed_packet=524288000; 回答2 您可以通过执行以下几个步骤来解决此问题: 1)打开您的终端窗口 2)请在您的终端中编写以下命令 ssh root@yourIP port 3
  • linux网络编程学习笔记(4)——udp编程及udp常见问题处理
    UDP协议是User Datagram Protocol的缩写,它是无连接,不可靠的网络协议。一般使用它进行实时性数据的传输,主要是因为它快,但因为它是不可靠的一种传输协议,所以不可避免的会出现丢包现象。本文就具体讨论导致UDP传输数据包丢失的原因以及一些基本的规避方法: 路由器转发造成的数据包丢失数据链路层MTU造成的数据包丢失缺少滑动窗口导致的数据包丢失收发缓存区大小造成的数据包丢失 (一)数据链路层MTU造成的数据包丢失 1.数据链路层的以太网帧结构 以太网帧结构由四个字段组成,各字段含义为: 目的地址:该地址指的是MAC地址,指该数据要发送至哪里源地址:MAC地址,填本地MAC地址,指该数据从哪里来类型:值该数据要交给上层(网络层)的那个协议(IP协议,ARP协议…)数据:要传输的数据,不过该数据有长度的要求,是在46–1500字节之间,该长度称为最大传输单元即MTU若数据长度不够46字节,则需要填充内容;若数据长度超过1500字节,则需要分片传输。 2.MTU MTU maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节,是指在传输数据过程中允许报文的最大长度。 3.MTU对IP协议的影响 IP报文在超过MTU后需要分片,接收端需要组装;一旦分片后的IP报文有一部分丢失,则接收端组装会失败
  • TCP Implementation in Linux
    A. IntroductionThis document provides a brief overview of how TCP is implemented in Linux. 1 It is not meant to be comprehensive, nor do we assert that it is without inaccuracies.本文档简要概述了如何在Linux中实现TCP。他可能并不全面,并且也不能保证完全准确。 B. TCP implementation in LinuxFigures 1 and 2 show the internals of the TCP implemen- tation in Linux kernel. Fig. 1 shows the path taken by a new packet from the the wire to a user application. The Linux kernel uses an sk buff data structure to describe each packet. When a packet arrives at the NIC, it invokes the DMA engine to place the packet into the kernel memory via
  • 第 1 行的 ERROR 2006 (HY000):MySQL 服务器已消失(ERROR 2006 (HY000) at line 1: MySQL server has gone away)
    问题 第 1 行的 ERROR 2006 (HY000):MySQL 服务器已消失 我面临同样的问题。 我正在尝试将 mysqldump 文件恢复到我的机器上。 该文件的大小为 2.7 MB。 我在第 1 行收到“错误 2006 (HY000):MySQL 服务器已消失”错误。 我增加了 max_allowed_pa​​cket 和 wait_timeout 的大小。 但没有任何效果。 以下是我的文件(my-medium.ini)的内容,请指出我错在哪里。 我的安装有各种ini文件,我修改过,我的大,我的中,我的小,我的大,我的innodb-heavy-4G。 提前致谢!! # Example MySQL config file for medium systems. # # This is for a system with little memory (32M - 64M) where MySQL plays # an important part, or systems up to 128M where MySQL is used together with # other programs (such as a web server) # # You can copy this file to # /etc/my.cnf to set global options, #
  • com.mysql.jdbc.PacketTooBigException(com.mysql.jdbc.PacketTooBigException)
    问题 我将图像存储在MYSQL中。 我有桌子 CREATE TABLE myTable (id INT, myImage BLOB); 当我尝试插入4.7MB文件时,出现异常 com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4996552 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable. 我相信这仅与图像大小有关。 我还可以使用其他变量类型吗? 更新1 按照旧的SO问题,我也尝试过MEDIUMBLOB但仍然出现相同的错误。 使用Java将图像添加到数据库 更新2 在项目开始时,我执行下面的查询,现在一切正常 SET GLOBAL max_allowed_packet = 1024*1024*14; 回答1 如错误所述,它与变量类型无关,而与max_allowed_pa​​cket变量无关: 如果使用大的BLOB列或长字符串,则必须增加此值。 它应该与要使用的最大BLOB一样大。 max_allowed_pa​​cket的协议限制为1GB。 该值应为1024的倍数; 非整数将四舍五入到最接近的倍数。 但是,通常来说,不要将文件存储在数据库中
  • MYSQL修改传输数据包大小值(max_allowed_packet)
    #查询允许的数据包大小 4194304字节为4MB select @@max_allowed_packet; #临时生效,设置最大值 30M set global max_allowed_packet =31457280 #永久生效,改配置文件 #linux vim /etc/my.cnf #windows #D:\Program Files\MySQL\MySQL Server 5.6\my-default.ini ##配置文件添加 [mysqld] max_allowed_packet = 30M 在线文件大小换算 https://www.bejson.com/convert/filesize/ 来源:https://blog.csdn.net/qq_18671415/article/details/115347360
  • TCP Implementation in Linux: A Brief Tutorial
    A. Introduction This document provides a brief overview of how TCP is implemented in Linux.It is not meant to be comprehensive,nor do we assert that it is without inaccuracies. B. TCP implementation in Linux Figures 1 and 2 show the internals of the TCP implementation in Linux kernel. Fig. 1 shows the path taken by a new packet from the the wire to a user application. The Linux kernel uses an sk buff data structure to describe each packet. When a packet arrives at the NIC, it invokes the DMA engine to place the packet into the kernel memory via empty sk buffs stored in a ring buffer called rx