Linux-Socket编程-TCP阻塞方式04


写一对TCP Socket 的测试程序,分为client 和server,分别运行在不同虚拟机上

  • 测试程序tcp_server4-1,接受client 的连接成功后,用read 函数一次读20 字节(此时对 方无输入,应进入阻塞状态)

  • 测试程序tcp_client4-1-1,连接服务端成功后,用write 函数向服务端一次性写入超过 20 字节的内容,观察sevrer 端read 函数的返回值和返回内容,是否与client 端写入内 容一致

    内容一致,测试截图:

  • 测试程序tcp_client4-1-2,连接服务端成功后,用write 函数向服务端写入,要求每次 写2 字节,然后延时1 秒,再写2 字节…,观察server 端read 函数的返回值和返回内 容,是否与client 端写入内容一致

    内容不一致,读取一次后读到2字节,执行后续程序,终止。测试截图:

  • 测试程序tcp_server4-2/tcp_client_4-2-1/tcp-client_4-2-2 , 将read/write 换成 recv/send 函数,用法是否相同?结果是否相同?

    此时问题分情况。

    tcp_4-2-1 tcp_4-2-2中send函数的flags均设置为0;

    当tcp_server4-2中recv函数的flags设置为0时,结果如下:

    当tcp_server4-2中recv函数的flags设置为MSG_WAITALL时,结果如下:

  • 如果要求read/recv 函数执行后,不读满20 字节一直不返回(client 端要求每次写2 字节, 然后延时1 秒,再写2 字节…),能否做到?如何做到?(注:不允许采用自己写循环保证读 满20 字节)

    recv函数能做到,方法如下:

    recv(connect_fd, buff, 20, MSG_WAITALL)
    
  • 给出read/recv 函数的使用区别,给出write/send 函数的使用区别

    read/write与recv/send的区别

    • 在功能上,read/write是recv/send的子集。read/wirte是更通用的文件描述符操作,而recv/send在socket领域则更“专业”一些。
    • 当recv/send的flag参数设置为0时,则和read/write是一样的。
    • 如果有如下几种需求,则read/write无法满足,必须使用recv/send:
      • 为接收和发送进行一些选项设置
      • 从多个客户端中接收报文
      • 发送带外数据(out-of-band data)