TCP、SOCKET网络编程流程与问题

1.SOCKET、TCP编程流程

  • TCP/IP协议及socket封装:

在这里插入图片描述

  • 套接字的编程流程:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2.常见问题

1.如果buffer中的数据过大,我也只需要调用一次send函数,而底层到底是一次传输成功还是陆续传输我不用管了吗;

答:recv到的数据流可能是断断续续的,你要把他们放在一起然后解码。

2.阻塞和非阻塞的区别?
答:send()函数发送数据分为堵塞和非堵塞;
阻塞模式下: 如果正常的话,会直到把你所需要发送的数据发完再返回;即接受断一次性接受发送的数据;
非阻塞模式,会根据你的socket在底层的可用缓冲区的大小,来将你的缓冲区当中的数据拷贝过去,有多大缓冲区就拷贝多少,缓冲区满了就立即返回,这个时候的返回值,只表示拷贝到缓冲区多少数据,但是并不代表发送多少数据,同时剩下的部分需要你再次调用send才会再一次拷贝到底层缓冲区;可能会导致数据丢失

作为一个套接字,它拥有两个缓冲,接收数据缓冲和发送数据缓冲(此缓冲不同与你自己定义的缓冲),当有数据到达时,首先进入的
就是接收数据缓冲,然后用户从这个缓冲中将数据读出来,这就是套接字接受的过程,这个缓冲的大小可以自己用**SetSocketOpt()**设定,

3.套接字缓冲取怎么理解?
答:socket缓冲区每一个socket在被创建之后,系统都会给它分配两个缓冲区,即输入缓冲区和输出缓冲区。在这里插入图片描述输入输出缓冲区,系统会为每个socket都单独分配,并且是在socket创建的时候自动生成的。一般来说,默认的输入输出缓冲区大小为8K。套接字关闭的时候,输出缓冲区的数据不会丢失,会由协议发送到另一方;而输入缓冲区的数据则会丢失

参考来源

3.socket编程中read()和write()

C语言socket编程中关于read()和write()的思考

猜你喜欢

转载自blog.csdn.net/qq_42698422/article/details/106868757