精华内容
下载资源
问答
  • 简单的c# TCP通讯(TcpListener) ...C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全 在发送端,一次发送200k个字节,在接收端,一次接收200k个字节, 但是在接收端,...

     

    简单的c# TCP通讯(TcpListener)

    C# 的TCP Socket (同步方式)

    C# 的TCP Socket (异步方式)

    C# 的tcp Socket设置自定义超时时间

    C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

     

     

    在发送端,一次发送200k个字节,在接收端,一次接收200k个字节,

    但是在接收端,经常会出现 socket.receive 接收不全的情况 ,

     

    偶尔接收的包也是正常的,用Wireshark抓包发现,每次发送都分成了多个1514字节长的数据包,一次数据有多个数据包,

     

    标准以太网帧长度下限为:64 字节

    标准以太网帧长度上限为:1518 字节

     

    每个数据包含1448字节有效数据

    这也正好解释了为什么接收数据包不完整时接收到的长度都正好是1448的倍数如1448,2896,4344等等

     

    所以需要多次接收然后对数据进行合并,代码如下:

     

    Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    listener.ReceiveBufferSize = 100 * 1024 * 1024;
    listener.ReceiveTimeout = 100000;
    listener.Bind(localEndPoint);
    
    Socket sock = listener.Accept();
    byte[] bs = new byte[1024*1024];
    int ilen = sock.Receive(bs);
    uint length = ByteTouint(bs, 3, 4);
    while (ilen < length)
    {
        int ii = sock.Receive(bs, ilen, 500 * 1024, SocketFlags.None);
        ilen = ilen + ii;
    }

    这样接收的内容就对了。

     

     

    异步方式里  C# 的TCP Socket (异步方式) ,在ReadCallback里

    while (bytesRead < state.bodybuffer.Length)
                    {
                        int ii = handler.Receive(state.bodybuffer, bytesRead, state.bodybuffer.Length - bytesRead, SocketFlags.None);
                        bytesRead = bytesRead + ii;
                    }

     

     

    作者:车小胖
    链接:https://www.zhihu.com/question/21524257/answer/118266374
    来源:知乎
    著作权归作者所有,转载请联系作者获得授权。

    最早的以太网工作方式:载波多路复用/冲突检测CSMA/CD,因为网络是共享的,即任何一个节点发送数据之前,先要侦听线路上是否有数据在传输,如果有,需要等待,如果线路可用,才可以发送。

    假设A发出第一个bit位,到达B,而B也正在传输第一个bit位,于是产生冲突,冲突信号得让A在完成最后一个bit位之前到达A,这个一来一回的时间间隙slot time是57.6μs.


    在10Mbps的网络中,在57.6μs的时间内,能够传输576个bit,所以要求以太网帧最小长度为576个bits,从而让最极端的碰撞都能够被检测到。这个576bit换算一下就是72个字节,去掉8个字节的前导符和帧开始符,以太网帧的最小长度为64字节。


    如果说以太网帧的最小长度64byte是由CSMA/CD限制所致,那最大长度1500byte又是处于什么考虑的呢?

    IP头total length为两个byte,理论上IP packet可以有65535 byte,加上Ethernet Frame头和尾,可以有65535 +14 + 4 = 65553 byte。如果在10Mbps以太网上,将会占用共享链路长达50ms,这将严重影响其它主机的通信,特别是对延迟敏感的应用是无法接受的。

    由于线路质量差而引起的丢包,发生在大包的概率也比小包概率大得多,所以大包在丢包率较高的线路上不是一个好的选择。

    但是如果选择一个比较小的长度,传输效率又不高,拿TCP应用来说,如果选择以太网长度为218byte,TCP payload = 218 - Ethernet Header -IP Header - TCP Header=218-18 - 20 -20= 160 byte

    那有效传输效率=160/218= 73%

    而如果以太网长度为1518,那有效传输效率=1460/1518=96%

    通过比较,选择较大的帧长度,有效传输效率更高,而更大的帧长度同时也会造成上述的问题,于是最终选择一个折衷的长度:1518 byte ! 对应的IP packet 就是 1500 byte,这就是最大传输单元MTU的由来。

    转载于:https://www.cnblogs.com/jhlong/p/5799413.html

    展开全文
  • importjava.net.DatagramPacket;importjava.net.DatagramSocket;...public classSender {public static voidmain(String[] args) {try{//创建发送方的套接字,IP默认为本地,端口号随机DatagramSocket sendSocket...

    importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;public classSender {public static voidmain(String[] args) {try{//创建发送方的套接字,IP默认为本地,端口号随机

    DatagramSocket sendSocket = newDatagramSocket();//确定要发送的消息:

    String mes = "你好!接收方!";//由于数据报的数据是以字符数组传的形式存储的,所以传转数据

    byte[] buf =mes.getBytes();//确定发送方的IP地址及端口号,地址为本地机器地址

    int port = 8888;

    InetAddress ip=InetAddress.getLocalHost();//创建发送类型的数据报:

    DatagramPacket sendPacket = newDatagramPacket(buf, buf.length, ip, port);//通过套接字发送数据:

    sendSocket.send(sendPacket);//确定接受反馈数据的缓冲存储器,即存储数据的字节数组

    byte[] getBuf = new byte[1024];//创建接受类型的数据报

    DatagramPacket getPacket = newDatagramPacket(getBuf, getBuf.length);//通过套接字接受数据

    sendSocket.receive(getPacket);//解析反馈的消息,并打印

    String backMes = new String(getBuf, 0, getPacket.getLength());

    System.out.println("接受方返回的消息:" +backMes);//关闭套接字

    sendSocket.close();

    }catch(Exception e) {

    e.printStackTrace();

    }

    }

    }importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketAddress;public classReceive {public static voidmain(String[] args) {try{//确定接受方的IP和端口号,IP地址为本地机器地址

    InetAddress ip =InetAddress.getLocalHost();int port = 8888;//创建接收方的套接字,并制定端口号和IP地址

    DatagramSocket getSocket = newDatagramSocket(port, ip);//确定数据报接受的数据的数组大小

    byte[] buf = new byte[1024];//创建接受类型的数据报,数据将存储在buf中

    DatagramPacket getPacket = newDatagramPacket(buf, buf.length);//通过套接字接收数据

    getSocket.receive(getPacket);//解析发送方传递的消息,并打印

    String getMes = new String(buf, 0, getPacket.getLength());

    System.out.println("对方发送的消息:" +getMes);//通过数据报得到发送方的IP和端口号,并打印

    InetAddress sendIP =getPacket.getAddress();int sendPort =getPacket.getPort();

    System.out.println("对方的IP地址是:" +sendIP.getHostAddress());

    System.out.println("对方的端口号是:" +sendPort);//通过数据报得到发送方的套接字地址

    SocketAddress sendAddress =getPacket.getSocketAddress();//确定要反馈发送方的消息内容,并转换为字节数组

    String feedback = "接收方说:我收到了!";byte[] backBuf =feedback.getBytes();//创建发送类型的数据报

    DatagramPacket sendPacket = newDatagramPacket(backBuf,

    backBuf.length, sendAddress);//通过套接字发送数据

    getSocket.send(sendPacket);//关闭套接字

    getSocket.close();

    }catch(Exception e) {

    e.printStackTrace();

    }

    }

    }

    展开全文
  • 分包发送,尝试每个包加延时,发送失败一直循环发送,实验不行,多次后单片机死机, 最终解决方法,建一个10ms的定时任务,在连续发送的过程中,如果失败则跳出循环,到下一次定时到来重新发送,给单片机空闲时间...

    分包发送,尝试每个包加延时,发送失败一直循环发送,实验不行,多次后单片机死机,
    最终解决方法,建一个10ms的定时任务,在连续发送的过程中,如果失败则跳出循环,到下一次定时到来重新发送,给单片机空闲时间处理其他事务。

    展开全文
  • Vxworks使用UDP发送大数据包

    千次阅读 2009-03-18 23:48:00
    问题:使用Vxworks发送数据包(20476 Byte)到Windows XP,当程序工作一段时间20分钟左右再也接收不到数据。但是如果使用 windows与windows之间,vxworks与vxworks之间数据一直接收良好。 原因: VxWorks5.5与...

     问题:使用Vxworks发送数据包(20476 Byte)到Windows XP,当程序工作一段时间20分钟左右再也接收不到数据。但是如果使用 windows与windows之间,vxworks与vxworks之间数据一直接收良好。

    原因: VxWorks5.5与Windows的IP分片算法不一致。 VxWorks 5.5 底层IP分片时把数据包分为了两个包(共14片:一个包为13片,共计20402个字节;一个包为1片,344字节)发送,这就导致我windows端在接收时把其当成两个包来处理,这样windows的IP层就没法把接收到的两个UDP包组合成一个UDP包上传给上层。 所以当vxworks拆分后的两个包中的任意一个丢失时,window端相当与只接收到的一个数据包一部分,就会导致数据一直错位。

    展开全文
  • 在默认情况下,一般都只发送四个数据包,通过这个命令可以自己定义发送的个数,对衡量网络速度很有帮助,比如我想测试发送50个数据包的返回的平均时间为多少,最快时间为多少,最慢时间为多少就可以通过以下获知: ...
  • GB28181::解决exosip发送大数据包问题

    千次阅读 2014-03-11 09:27:09
    EXOSIP默认的包大小为4K,超过4K就会发送失败.因此可以修改下面这里: osip_message.h中有这一段 #ifndef SIP_MESSAGE_MAX_LENGTH /**  * You can re-define your own maximum length for SIP ...
  • 通过几天的调试,目前可以发送任意大小的数据包,大小为1-16KB,全部使用中断收发,效率极高。 增加波特率设置2Kbps-100Kbps任意设置 增加通信信道设置0-255 增加发送功率设置0-7 底层代码 [cpp] ...
  • 使用Qt编写TCP客户端时,需要完成自动重连服务器,实际使用中开启了一个线程用于断线重连操作和其他自动发送任务等。 初始化: m_tcpClient = new QTcpSocket(this); m_tcpClient->abort();//取消原有连接 ...
  • https://www.jianshu.com/p/8fe70d313d78?utm_source=oschina-app 转载于:https://www.cnblogs.com/tc310/p/10418953.html
  • Hping3 使用 -E 和 -d 两个参数可以发送指定数据包内容到目标机。 -d 指定数据包大小 -E 指定发送数据包内容 默认是以 TCP 方式发送,-2 可以指定以 UDP 方式发送。 如: echo "hello worlde" > test.txt ...
  • 请问大神,怎样像ping程序一样,向一个IP地址发送固定大小数据包,然后通过反馈调整数据包大小,来检测链路的MTU?
  • 作者丨wuyangchunhttps://segmentfault.com/a/1190000008836467?utm_source=tag-newest本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的。如果英文没有问题,强烈建议阅读后面参考里的两篇文章,...
  • 利用udp发送数据包

    2015-10-09 13:46:25
    利用udp发送百万数据包,每个数据包大小为1500bytes(其中数据为1472bytes)的耗时(us)
  • 我用winpcap的发送队列发送数据包,文件大小100M左右可以正常发送,抓包工具可以抓到包,但200M左右就发不了,运行黑框界面一闪而过,这是为什么,咋解决,
  • 所以你发2000字节,你调用一次send,如果发送缓冲区移动窗口够,应该会全部成功。否则,会返回实际发送的字节。假设2000字节全部成功,tcp实际会将其分为1460和540两个包发送,接受端接受到1460这个包就会回一次ACK...
  • 来介绍一下TCP和UDP协议发送数据包的大小
  • iperf 发送固定大小TCP数据包

    千次阅读 2018-03-16 11:09:00
    网络堆栈可以将其分成不同大小的数据包。如果是TCP测试,则TCP可以根据-M参数将发送分为更小的TCP分段。 ———————————————————————————————————————————— 更新于3月...
  • 数据转发过程概述数据包在相同网段内或不同网段之间转发所依据的原理基本一致。一、数据帧封装TCP封装(四层)当主机建立了到达目的地的TCP连接后,便开始对应用层数据进行封装。主机A会对待发送的应用数据首先执行...
  • 基于winpcap发送数据包

    热门讨论 2011-04-09 21:24:32
    标 题: 【原创】基于WinPCap的网络协议开发 - 炮王(超级打炮机)发送数据包(03) 作 者: 加百力 时 间: 2009-05-18,16:55:36 链 接: http://bbs.pediy.com/showthread.php?t=89175 【文章标题】: 基于WinPCap的...
  • 对于过或者过小的数据包,不发送;最大最小帧的大小是以太网规定的,对于过小的帧,在发送时要填充。  TPSR为发送起始寄存器,将StartPage写入TPSR寄存器,高字节写入TBCRH(TBCR1),低字节写入TBCRL(TBCR0)...
  • Ethereal是一个开放源码的网络分析系统,也是是目前最好的开放源码的网络协议分析器,支持Linux和windows平台。它目前所提供的强大的协议分析功能完全可以媲美商业的网络分析系统,事实上由于网络上各种协议种类繁多...
  • TCP和UDP 协议发送数据包的大小 在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?  当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,259
精华内容 2,103
关键字:

发送大数据包