接着前一篇,我们来看这个应用程序背后,内核真正做了一些什么事情。
代表MY_INET域套接字的结构体struct
inet_sock有一个成员recverr,它占1bit长度,可能的取值是1或0,当为0时表示socket上出错时,只通过系统调用向应用程序返回
错误号,不提供进一步的详细信息。当取值为1时,则表示socket上出错时,则向struct
inet_sock的成员sk_error_queue(一个sk_buff的队列)存入一个特殊的struct
sk_buff,在sk_buff的成员cb中放入详细的错误信息,应用程序通过特定的系统调用可以取得详细的出错信息。
recverr的值可以通过套接字选项操作进行设置,它是一个IP层的选项,对应的选项名是IP_RECVERR。下面的代码就是将它的值设为1(打开选项):
int val = 1;
if( setsockopt( fd, SOL_IP, IP_RECVERR, &val, sizeof(val) ) == -1 )