美文网首页
TCP客户端

TCP客户端

作者: StevenHD | 来源:发表于2020-12-05 19:20 被阅读0次
    总纲

    一、TCP客户端

    • 客户端通过connect()来完成3次握手,服务器通过accept()来完成3次握手

    • WireShark抓包三次握手的结果——


      抓包三次握手

    1.1 如果服务器关闭,客户端依然发起连接会是什么情况?

    注意RST

    客户端依然会发送一个SYN报文,但是服务器会返回一个RST和ACK,ACK是应答SYN,RST则表示需要重置

    • 如果把网线拔了,那么就会造成网络不通畅,那么什么都发不过去

    1.2 服务器端代码的改变

    • 为了可以进行读写数据,对代码进行改写——


      图示代码

    服务器端读完一遍马上就会关闭

    1.3 客户端代码

    原先的TCP客户端
    改写的TCP客户端

    1.4 使用wireshark观察协议栈的变化

    注意:`PSH`标志位
    • 这时候就会有应用层的数据helloworld

    1.5 read()函数是否是阻塞的?

    • 如果没有数据可读取,read()函数默认是阻塞的。
      read是阻塞的

    我们可以在write()之前先sleep()个10s,发现服务器那里就在一直等着,10s后会读取到write()中包含的数据

    • 如何将阻塞的改成非阻塞的呢?——使用fcntl()系统调用

    1.6 write()函数调用2次,但服务器读的时候只读一次

    • 写端进行写2次,写2串数据,服务器端只读1次的情景——

    客户端代码:


    图示代码

    服务器端代码还是跟之前一样,不要改变

    • 结果是write()函数调用2次发送的2个字符串,都一次性读完了
      结果

    原因是TCP是一个流协议,而不是一个数据报协议。数据报也许是一整块一整块的,但是流协议就像管道一样,会排队,有先后之分。

    二、服务器循环读取数据

    • 之前的服务器都是只读一次,现在改成循环读取数据——

    加一个循环,并且不关闭文件描述符fd


    循环读取客户端发送来的数据代码

    2.1 优化后的服务器代码

    • 之前的代码有Bug,如果客户端关闭了连接。接收到的字符数量就是0,那么就需要直接关闭fd,而不是继续读取——
    这里的代码没有加break
    加上break

    2.2 如果是多个客户端会不会有问题

    • 不会出现客户端端口被占用的问题

    因为客户端的端口都是临时分配的,不会产生端口被占用的情况

    • 但是会出现,客户端A发生数据可以被服务器接收,但是客户端B发送数据接受不了,只有当客户端A关闭后,服务器才会接收到客户端B发送来的数据

    三、客户端循环发送数据

    图示代码

    相关文章

      网友评论

          本文标题:TCP客户端

          本文链接:https://www.haomeiwen.com/subject/favgwktx.html