已知字符串长度情况下完善回声客户端

# gcc echo_client2.c -o eclient2

# ./eclient2 127.0.0.1 9190

Connected

Input message (Q to quit): orange

Message from server: orange

Input message (Q to quit): hhhhhhhhhhhhhhhhhhhhhhhhhhhh

Message from server: hhhhhhhhhhhhhhhhhhhhhhhhhhhh

Input message (Q to quit): q

服务端同上一章。

定义应用层协议

原书中有些bug,服务端接收到的操作数个数没有转换成int。经fix后代码见附录,运行结果如下:

# ./opserver 9190

Connected client 1

Connected client 2

Connected client 3

# ./opclient 127.0.0.1 9190

Connected

Input operand count: 3

Input operand: 1

Input operand: 5

Input operand: 9

Input operator: +

Operation result: 15

# ./opclient 127.0.0.1 9190

Connected

Input operand count: 4

Input operand: 16

Input operand: 8

Input operand: 4

Input operand: 2

Input operator: -

Operation result: 2

# ./opclient 127.0.0.1 9190

Connected

Input operand count: 2

Input operand: 5

Input operand: 7

Input operator: *

Operation result: 35

TCP原理

I/O缓冲特性:

I/O缓冲在每个TCP套接字中单独存在。

I/O缓冲在创建套接字时自动生成。

即使关闭套接字也会继续传递输出缓冲区中的遗留数据。

关闭套接字将丢失输入缓冲区中的遗留数据。

习题

请说明TCP套接字连接设置的三次握手过程。尤其是3次数据交换过程每次收发的数据内容。

1)A向B发起连接,发送SYN包(SYN=1,seg=X)

2)B回复SYN_ACK包(SYN=1,ACK=1,seg=Y,ack number=X+1)

3)最后A向B传输消息(ACK=1,seg=X+1,ack number=Y+1)

从步骤3)开始A就可以携带应用层数据了。

TCP是可靠的数据传输协议,但在通过网络通信的过程中可能丢失数据。请通过ACK和SEQ说明TCP通过何种机制保证丢失数据的可靠传输。

SEQ是当前数据起始字节的序号,加入收到对方返回的ACK刚好是SEQ+数据大小(以字节为单位),则代表正确送达,可以继续发送后续数据包。反之,在计时器超时后进行重传。

TCP套接字中调用write和read函数时数据如何移动?结合I/O缓冲进行说明。

write函数调用瞬间,数据将移至输出缓冲;read函数调用瞬间,从输入缓冲读取数据。

对方主机的输入缓冲剩余50字节空间时,若本方主机通过write函数请求传输70 字节,请问TCP如何处理这种情况?

将70字节数据放入输出缓冲,然后发送50字节到对方主机,待对方主机的输入缓冲又有剩余时再发送后面的字节。

第2章示例tcp_server.c和tcp_client.c中,客户端接收服务器端传输的字符串后便退出。现更改程序,使服务器端和客户端各传递1次字符串。考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度。连接时服务器端和客户端数据传输格式如下。另外,不限制字符串传输顺序及种类,但须进行3次数据交换。

代码见附录。

0 0 0 6 H e l l o ?

|-- 字符串长度 --|------ 字符串数据 ------|

# gcc tri_server.c -o tserver

# ./tserver 9191

Connected client 1

Message from client: Hello?

Input message: Hi!

Message from client: This is Xiao.

Input message: I'm Yao.

Message from client: Nice to meet you!

Input message: Me, too.

# gcc tri_client.c -o tclient

# ./tclient 127.0.0.1 9191

Connected

Input message: Hello?

Message from server: Hi!

Input message: This is Xiao.

Message from server: I'm Yao.

Input message: Nice to meet you!

Message from server: Me, too.

创建收发文件的服务器端/客户端,实现顺序如下。

a. 客户端接受用户输入的传输文件名。

b. 客户端请求服务器端传输该文件名所指文件。

c. 如果指定文件存在,服务器端就将其发送给客户端;反之,则断开连接。

代码见附录。

# gcc file_server.c -o fserver

# ./fserver 9190

Connected client

# gcc file_client.c -o fclient

# ./fclient 127.0.0.1 9190

Connected

Input file name: exercise6

我的问题

把int存到char型数组中后发生了什么?

fgetc(stdin)的作用?

删除stdin中的"\n"字符,因为前面读取操作数的时候,最后有一个回车,他不能被当做运算符读进来。而前面读操作数之前为什么不fgetc一下呢?因为读取的是%d,它会自动找到整数来读取,忽略先导的空白符(指空格符、制表符、回车符)。但当读取的是%c的时候,scanf把缓冲区的第一个字符返回回去,不管是什么,所以如果不fgetc就会读取出“\n”。

seq与ack number的关系?

书中的seq与ack number有错误。以图5-4为例进行改正。

A B

| --- seq 1200 (100 bytes data) --> |

|

| --- seq 1300 (100 bytes data) --> |

|

C语言如果不初始化局部整型变量,里面的值是什么?

与编译器有关。对GCC来说,局部整型变量里的值是随机的。所以初始化是必需的。

为什么要用fgets读取用户输入,而不是scanf?

scanf遇空白符(空格、回车、制表符)即终止读取,无法一次性读取完整的一个句子。而fgets每次读取一行。

附录

创建收发文件的服务器端 客户端,TCP/IP网络编程 Chap.5 基于TCP的服务器端/客户端(2)...相关推荐

  1. TCP/IP网络编程之四书五经

    TCP/IP网络编程之四书五经 孟岩 TCP/IP协议是目前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要.从 应用上来说,现在直接利用C层次Socket API进行TCP/IP ...

  2. TCP/IP网络编程之基于TCP的服务端/客户端(一)

    TCP/IP网络编程之基于TCP的服务端/客户端(一) 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于 ...

  3. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  4. TCP/IP网络编程(3)

    基于DUP的服务端与客户端 在TCP/IP网络编程(2)中,介绍了TCP/IP的四层模型,传输层分为TCP和UDP两种方式,通过TCP套接字完成数据交换已经进行了介绍,下面介绍通过UDP套接字完成数据 ...

  5. TCP/IP网络编程(1)

    1. 套接字 套接字是由操作系统提供的网络数据通信软件设备,即使对网络数据传输原理不了解,也能够使用套接字完成网络数据传输.为了与远程计算机进行数据传输,需要连接到英特网,套接字就是进行网络连接的工具 ...

  6. TCP/IP网络编程之多进程服务端(二)

    TCP/IP网络编程之多进程服务端(二) 信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非 ...

  7. TCP/IP网络编程(一)

    TCP/IP网络编程读书笔记 第1章 理解网络编程和套接字 1.1 理解网络编程和套接字 1.1.1 构建打电话套接字 1.1.2 编写 Hello World 套接字程序 1.2 基于Linux的文 ...

  8. TCP/IP网络编程:P1->理解网络编程和套接字

    本系列文章为<TCP/IP网络编程----尹圣雨>学习笔记 文章目录 一.理解网络编程和套接字 1.1 构建接电话套接字 1.2 编写"Hello world!"服务器 ...

  9. TCP/IP网络编程---Linux系统下的TCP套接字编程

    目录 第一章 理解网络编程和套接字 1.1 网络编程和套接字概要 1.2 基于Linux的文件操作 1.2.1 底层文件访问和文件描述符 1.2.2 打开文件 1.2.3 关闭文件 1.2.4 将数据 ...

最新文章

  1. spring boot:java.lang.IllegalStateException异常
  2. java学习路线_java学习路线_我的入坑路
  3. MyEclipse设置像visual studio一样的智能提示
  4. AcWing - 246. 区间最大公约数(树状数组+线段树)
  5. 蓝色三角_叶子长得像韭菜,花朵开得像个糖三角的鸢尾,用这3个方法拍摄它...
  6. C++学习——引用和指针
  7. react优秀项目案例_关于进行2019年北京市高等学校“实培计划”项目——毕业设计(创业类)项目总结与优秀项目案例征集的通知...
  8. 潘石屹没跑,他去学 Python 了
  9. python浮点数保留两位小数_(RPA)学习——Python 保存两位小数
  10. html站点的定义,HTML是什么?您构建网页的一站式解决方案
  11. 广联达报错access_广联达土建算量软件错误提示大全及解决方法(持续更新至20170418)...
  12. linux怎么复制文件和移动文件
  13. java 继承抽象类_java基础之继承,抽象类
  14. 如何压缩ppt文件,这个方法你该知道
  15. 电气火灾的危害及预防
  16. Git系列——删除文件的找回
  17. python编程从入门到实战16章x轴刻度与书不一样,2020-10-05 Python编程从入门到实践 第16章 下载数据 动手试...
  18. 《Microsoft COCO Captions Data Collection and Evaluation Server》论文笔记
  19. 面试|复习小册(2022-9)
  20. SiamFC++ SiamCAR SiamBAN

热门文章

  1. 如何查看自己电脑上是否成功安装了Mysql,以及如何查看mysql的安装目录
  2. linux sparse
  3. Unirech阿里云国际版云服务器ecs的应用场景有哪些?
  4. 宏观经济学gdp计算方法_宏观经济学GDP中存货是怎么算的,能说一下吗
  5. 目标文件和可执行文件区别
  6. python回调廖雪蜂_Python 廖雪峰教程《三》
  7. 一文掌握java对内存空间的划分
  8. NB-IOT修改KV值的方法
  9. CyberWorld赛博世界是否能成为元宇宙核心力量
  10. iOS 应用程序的生命周期