您的位置:首页 > 其它

关于socket的一些个人理解

2014-06-01 01:11 375 查看
1.TCP与UDP接收方式是不同的。

TCP是基于流的,UDP是基于数据报的。体现在socket的接收与发送上区别明显。

UDP的数据接收缓冲区中回依次保存接收到的数据,如果缓冲区满了,再次接收到的数据就会被丢弃,UDP接收数据与发送数据的次数应该是相同的,UDP不管你每次接收的数据多少,只要你接收了一次数据那么就相当于接收看了发送端某次发送的数据,而不管你接收的多少,本次的数据都将会被清空。TCP协议接收的数据不会被后达的数据覆盖而是连续地存放在接收缓冲区中,读取指定大小的数据时,只清除已真实读取的数据,就像流一样,而且TCP最重要的地方就是差错控制,重要的一点就是流量控制。

 

2.TCP在发送数据的时候,把要发送的数据拷贝到socket对应的发送缓冲区中,由socket的本身的机制把缓冲区中的数据通过TCP/IP协议栈进行发送,这个发送的过程是不需要程序员操心的,由os自己维护。

 

3.TCP在接收数据的时候,socket机制中的协议栈负责把对方发送过来的数据存储在自己的socket接收缓冲区中,然后程序员可以调用recv等函数从接收缓冲区中读取出函数参数指定长度的数据。读取出数据后,socket底层机制会清除接收缓冲区中拷贝出来的数据。Socket底层机制也会清除发送缓冲区中已发送出去的数据。

 

4.Socket接收缓冲区与发送缓冲区的大小是可以通过setsockopt函数进行设置的。

 

5.在阻塞与非阻塞两种情况下,socket的发送与接收是不同的,下面将在原理上进行分析。

Send在阻塞下,正常情况下会把指定要发送的数据发送完毕后再返回;非阻塞下,会根据socket底层机制的可用缓冲区的大小,来将疏浚拷贝到发送缓冲区中,有多大的缓冲区就拷贝多少,缓冲区填满两颗就立即返回,这个时候返回的是已完成拷贝数据的长度,但是并不代表发送了多少数据,同时剩下的部分需要你再次调用send才会再一次拷贝到底层缓冲区。

如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲区中的数据copy到buf中。注意协议接收数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的缓冲区的数据copy完。Recv函数仅仅是copy数据,真正的接收数据时协议来完成的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: