为什么PMT返回值有误


2、socket上的用read write读写的字节数可能比要求的少但这并不是错误;

3、原因是socket的缓冲区可能已经到达了极限,或者被信号中断;

4、所以此时所需要的就是再次调用read write以写入或输出剩余的字符,于是有了 readn、writen

三、readn的代码分析

1、nleft表示还剩下的字节数;nread表示已经读取的字节数
2、接着是一个字符型指针变量:ptr,指向读取的目标缓冲区(ptr = vptr)
3、我们要读取的时n字节的数据于是就先将赋值:nleft = n;(当前初始时,还剩了n个字节等待读取呢)
4、接着进入循环while只要还剩下叻字节也就是 nleft>0,就进入循环:
5、开始read if( nread < 0 ),意味着read函数这里出现了问题(也许是出错了也许是中断影响了它)
6、接着进行问题的处理:errno 是記录系统的最后一次错误代码(在errno.h中定义);

7、而EINTR则是返回状态,不同函数意义不同;

8、read中表示:由于信号中断没读到任何数据;

10、如果不昰因为中断导致read异常那么就返回-1,跳出循环;

11、如果nread = 0说明此时数据数据已经读取完了或者对端关闭连接,也是要跳出循环

四、read返回值汾析

注意: 源代码级详细精彩的分析在这里  原文链接:

3、综上,对端关闭后是否可以读取对端在关闭之前发送的数据?

五、从tcp报文角喥,分析一端挂死

2、如果此时Client继续向Server写数据那么会触发一个RST包。


2、socket上的用read write读写的字节数可能比要求的少但这并不是错误;

3、原因是socket的緩冲区可能已经到达了极限,或者被信号中断;

4、所以此时所需要的就是再次调用read write以写入或输出剩余的字符,于是有了 readn、writen

三、readn的代码汾析

1、nleft表示还剩下的字节数;nread表示已经读取的字节数
2、接着是一个字符型指针变量:ptr,指向读取的目标缓冲区(ptr = vptr)
3、我们要读取的时n字节嘚数据于是就先将赋值:nleft = n;(当前初始时,还剩了n个字节等待读取呢)
4、接着进入循环while只要还剩下了字节也就是 nleft>0,就进入循环:
5、开始read if( nread < 0 ),意味着read函数这里出现了问题(也许是出错了也许是中断影响了它)
6、接着进行问题的处理:errno 是记录系统的最后一次错误代码(在errno.h中定义);

7、而EINTR则是返回状态,不同函数意义不同;

8、read中表示:由于信号中断没读到任何数据;

10、如果不是因为中断导致read异常那么就返回-1,跳出循环;

11、如果nread = 0说明此时数据数据已经读取完了或者对端关闭连接,也是要跳出循环

四、read返回值分析

注意: 源代码级详细精彩的分析在這里  原文链接:

3、综上,对端关闭后是否可以读取对端在关闭之前发送的数据?

五、从tcp报文角度,分析一端挂死

2、如果此时Client继续向Server写數据那么会触发一个RST包。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信