• 许童童
    2019-08-14
    第一个场景中,可以添加超时时间做处理,当然你也可以自己实现一个复杂的请求-确认模式,那这样就跟TCP类似了,HTTP/3就是这样做的。

    用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535- IP头(20) - UDP头(8)=65507字节。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误。
    由于IP有最大MTU,因此,
    UDP 包的大小应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
    TCP 包的大小应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)
    展开
     5
     39
  • 刘明
    2019-08-14
    1、一直阻塞会导致程序无法正常退出,可以使用接收超时、IO多路复用的超时机制。

    2、IP和UDP头中都有16bit的长度字段,最长65535字节,去掉头部长度得到UDP数据净荷长度:65535-20-8=65507字节。
     1
     9
  • 范龙dragon
    2019-08-18
    客户端代码的29行sendline数组之前没有初始化数组元素为0,直接用strlen应该会有问题吧,strlen不是以0作为结束标志吗?

    作者回复: 好问题,fgets函数会"默默"的给我们加上\0

    
     4
  • tongmin_tsai
    2019-09-30
    老师,UDP被IP层分包发送后,对端如何保证UDP包整个组合的?比如用UDP发送3000字节,假设拆分2个MTU发送,后一个先到服务端,前一个后到服务端,那应用层接收的时候,UDP怎么组装的?

    作者回复: 很简单,1-1500为一个seq=1的包,1501-3000为seq=2的包,根据sequence组装就可以了。

    
     2
  • kissingers
    2019-09-06
    老师,TCP 流,UDP包,流的说法怎么理解?

    作者回复: 流就像水流,一直持续不断的流淌,只不过流淌的是0101这样的比特流。

     1
     2
  • 江永枫
    2019-08-14
    关于阻塞io,可以考虑使用多线程模型去提升性能,或者结合io多路复用来处理能力。


    https://m.php.cn/article/410029.html

    作者回复: 很快就会讲到了 :)

    
     2
  • Godblesser
    2019-08-14
    recvfrom函数可以设置超时,当限定时间内未接收到服务器端回复,打印超时消息并退出
    
     2
  • 记事本
    2019-08-14
    recv from会导致进程一直阻塞,可以通过setsocketopt接口设置TIMEOUT 超时后退出.
    
     2
  • 旅途
    2019-12-29
    第一个思考题 另起一个线程进行recvfrom

    作者回复: 我的本意是使用超时或者非阻塞来解

    
     1
  • 奔奔奔跑
    2019-11-23
    老师,学完这章我有个不理解的地方,UDP是客户端向服务端发消息,服务端收到客户端的报文,根据报文的地址在传消息回去,因此服务端不能主动向客户端发消息。那么客户端如果也bind,那么服务端也能向客户端发消息了,老师我这么理解对吗

    作者回复: 那走的就是两条不同的连接了
    A-->B
    B-->A

     1
     1
  • godtrue
    2019-11-22
    小结
    1:UDP是一个不可靠的通信协议,没有重传和确认,没有有序控制,也没有拥塞控制。
    2:UDP 不保证报文的有效传递,不保证报文的有序,也就是说使用 UDP 的时候,我们需要做好丢包、重传、报文组装等工作。
    3: UDP 相对TCP比较简单,适合的场景还是比较多的,我们常见的 DNS 服务,SNMP 服务都是基于 UDP 协议的,这些场景对时延、丢包都不是特别敏感。另外多人通信的场景,如聊天室、多人游戏等,也都会使用到 UDP 协议。
    4:把UDP协议比做发生明信片确实生动形象,我告诉邮局送到那些地址,具体送到没有,需要接收端主动的响应(注意:这里的响应者更靠上层)协议本身不会进行重传/确认/时序/拥塞等控制。
    展开
    
     1
  • 你好
    2019-10-30
    多人聊天室使用UDP,消息发出后怎么保证消息可以被收到呀,UDP不是不可靠传输嘛,中间丢了消息咋办呀

    作者回复: 第一,丢了就丢了,反正UDP就是不可靠的;

    第二,给每条消息加个sequence,收到后再确认,一段时间内没收到,就重发。

     2
     1
  • 云端
    2019-09-22
    老师您好:
    阻塞=进程或线程挂起?

    作者回复: 是的。

    
     1
  • 破晓^_^
    2019-09-10
    函数sendto原型参数写错了,应该为ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags,const struct sockaddr *to, socklen_t addrlen); 最后一个参数与recvfrom不一样.

    作者回复: 笔误,感谢斧正,我来修正。

    
     1
  • 马留
    2019-08-29
    如果对udp套接字调用了listen函数,会怎么样呢?

    作者回复: 改下程序,试试就知道了,最好把你的结果贴上来,大家一起研究。

     2
     1
  • ........
    2019-12-19
    老师, 请问一下, 这个read函数, 是不是每次可以不读够1024字节, 所以才需要使用readn取封装一下

    作者回复: 是的,每次能读取多少,取决于对方发送了多少,如果对方发送的没有够1024,或者是1024+256这样的,就必须再重复去读,用readn就是这个目的。

    
    
  • 流浪在寂寞古城
    2019-10-31
    https://github.com/worsun/study/tree/master/hack_time/socket_code/6
    自己敲了可以运行的代码
    
    
  • 流浪在寂寞古城
    2019-10-31
    https://github.com/worsun/study/tree/master/hack_time/socket_code/6

    作者回复: 👍

    
    
  • LY.
    2019-10-28
    lib/common.h里面的内容从哪可以找到啊?

    作者回复: https://github.com/froghui/yolanda/tree/master/lib

    
    
  • 董尚斌
    2019-10-28
    第一个案例中,UDP客户端为啥要等响应呢?不是说丢出去就不管了吗。那相应的内容是啥呢?

    作者回复: UDP只是说是一个非面向连接的协议,在双方通信过程中,是需要互相发送报文,以便响应的,就像是一个基于UDP的聊天室,你看到别人的消息,也需要回一个消息,不同消息的内容就是响应的内容。

    
    
我们在线,来聊聊吧