• LDxy
    2019-09-12
    1,最终缓冲区的大小应该比预计接收的数据大小大一些,预防缓冲区溢出。2,完全可以动态分配,但是要记得在return前释放缓冲区

    作者回复: 👍

    
     7
  • yusuf
    2019-09-11
    1、大小一般为2的多少次方
    2、不能换成动态分配。在read中需要sizeof指明接受数据的最大长度,malloc返回的是一个指针,求指针的sizeof时返回的是指针所占内存大小(32位为4,64位为8),跟实际数据的大小不一致
     3
     3
  • TERRY.ROD
    2020-01-12
    课后题,我的理解是应用程序缓冲区大小设置,如果是预分配buffer情况,应该根据程序场景来的。这个buffer是通过recv系统调用从内核空间将数据拷贝到用户空间,如果buffer过小,会导致需要多次系统调用的开销,过大又会导致用户空间浪费,因此需要选择合适大小;第二个是可以选择动态malloc,只是需要注意释放,否则会有内存泄露的风险;当然也可以基于gc机制来统一回收!
    
    
  • 超大红细胞
    2020-01-11
    一开始不理解为什么设置了 timeout 的 recv 会返回 EAGAIN 错误,在我的知识体系中 EAGAIN 一般出现在非阻塞的 socket 中,后来 man 了一下 SO_RCVTIMEO,发现确实如此,给后面的同学提个醒:
    Specify the receiving or sending timeouts until reporting an error. The argument is a struct timeval. If an input or output function blocks for this period of time, and data has been sent or received, the return value of that function will be the amount of data transferred; if no data has been transferred and the timeout has been reached then -1 is returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if the socket was specified to be nonblocking.
    总之一句话,SO_RCVTIMEO 会导致 recv 返回 EAGAIN
    展开

    作者回复: 👍

    
    
  • motorlei
    2019-12-22
    老师能帮我看一下代码吗 我把这段时间学习到的 整合在一起 现在执行的时候出了一点问题 分析不出错误原因

    作者回复: 抱歉,这段时间一直忙,贴下你的代码链接

     1
    
  • godtrue
    2019-11-24
    😅读完好像明白了,其实应该没明白,因为,课后思考题,答不上来!

    在网络编程中,是否做好了对各种异常边界的检测,将决定我们的程序在恶劣情况下的稳定性,所以,我们一定要时刻提醒自己做好应对各种复杂情况的准备,这里的异常情况包括缓冲区溢出、指针错误、连接超时检测等。
    
    
  • 西兹兹
    2019-11-06
    但仔细看一下,这段代码很有可能会产生下面的结果。 下面贴的是两句代码变量声明和赋值,并不是所谓的结果,求解

    作者回复: 是这样,声明了一个128字节的数组,但是实际使用的时候,对第129个元素进行了赋值操作,相当于访问了一个没有声明的内存地址,导致产生访问错误,程序会退出。

    
    
  • 西兹兹
    2019-11-06
    通过 recv 读取的字符数为 128 时,就会是文稿中的结果。 结果是什么?文稿里并没给出相关结果

    作者回复:
    char buffer[128];
    buffer[128] = '\0';

    文稿中给出了,变成缓冲区溢出了。

    
    
  • 传说中的成大大
    2019-09-15
    第一问:
    不能太小也不能太大 太小了频繁的用户态和内核态切换,太大了读不够容易阻塞,就算不阻塞也容易浪费
    第二问:
    如果用malloc频繁的申请和释放也不太好 容易造成碎片
    
    
  • 一周思进
    2019-09-13
    判断是否换行也可以直接strstr判断吧?
    https://mp.weixin.qq.com/s/YvfZMO2gCjHWmrNRGpdibA
    我觉得这两种方式的问题就是把后面读取的数据丢弃了,这对于tcp通信可能存在问题吧?
    在想后面是不是得换成全局循环缓冲区读写?

    作者回复: 嗯,是需要抽象一个buffer对象来做的。

    
    
  • 徐凯
    2019-09-12
    第一题。是不是跟结构体字节对齐一样的意思。数据比如是2的倍数 可以方便cpu处理?
    第二题 可以是动态内存 有时候应用层分包可以自定义几m一个包 甚至更大 而栈上分配空间是有限的 平均都在2到4m的样子 如果在栈上分配缓冲区 可能你的程序会根据平台不同选择性崩溃,而在堆上则没有这个问题唯一需要注意的是内存泄漏问题 c++有智能指针可以避免,java应该更方便吧 它的内存回收不是很厉害的嘛
    
    
  • 刘晓林
    2019-09-12
    老师,第二个例子中,及时加上了msg_length和缓冲区length的大小比较,如果msg_length写得很大(但小于length)而实际数据没有那么大时,服务器也会阻塞在read上吧?所以说判断msg_length<=length并不能接read阻塞的问题呀,只能解内存溢出的问题。

    作者回复: 是的,如果是这样,只能说我们双方的通信协议没有得到严格的遵守。

    
    
  • Steiner
    2019-09-11
    我觉得不能用动态分配,如果程序崩溃了,内存还没回收会内存溢出吧
     5
    
我们在线,来聊聊吧