最近写一些在网络上捕获数据包的程序,用到了rawsocket,其中要用到setsocketoption()
原型为:setsocketoption(socketoptionlevel.ip,socketoptionname.headerincluded, 1);
第三个参数为什么要是 1 呢?原因是默认的值是 0 ,1表示打开这个选项。
那么还有多少这样的选项呢?答案是:很多,有200项左右。
于是有了下面的代码,它可以看一看你使用socket时每个option的默认值。知道了这些,你就
可以有的放矢的setsocketoption()了。
code:
---------------------------------------------------------------------------
namespace sky.socketoptions
{
using system;
using system.net.sockets;
public class socketoptions
{
public static void main(string[] args)
{
int count = 0;
//使用那种构造函数并不重要,何值也不重要,无非是clr分配一些相关的结构
//结构是重要的
socket socket = new socket(addressfamily.internetwork, sockettype.raw, protocoltype.ip);
type sol = typeof(socketoptionlevel);
type son = typeof(socketoptionname);
console.writeline("\tnum\tlevel\tname\t\tdefaultoption");
console.writeline("----------------------------------------------------------------");
foreach(string s1 in enum.getnames(sol))
{
foreach( string s2 in enum.getnames(son))
{
count++;
try
{
socketoptionlevel o1 = (socketoptionlevel)enum.parse(sol,s1);
socketoptionname o2 = (socketoptionname)enum.parse(son,s2);
console.write("\t{0}\t{1:-10}\t{2:-30}",count,s1,s2);
//get values
console.write("\t\t{0}\n",socket.getsocketoption(o1,o2));
}
catch(argumentnullexception)
{
console.write("\tnull\n");
}
catch(argumentexception)
{
console.write("\tnull\n");
}
catch(socketexception)
{
console.write("\tnull\n");
}
}
}
console.writeline("----------------------------------------------------------------");
/*
console.writeline("-------------socketoptionlevel---------------------------");
foreach ( string s1 in enum.getnames(sol))
{
console.writeline( "{0}",s1);
}
console.writeline("-------------socketoptionname----------------------------");
foreach( string s2 in enum.getnames(son))
{
console.writeline( "|{0}",s2);
}
console.writeline("------------------end------------------------------------");
*/
console.readline();
}
}
}
---------------------------------------------------
下面是屏幕截图:
