如何使用raw sockettype设置套接字

时间:2016-03-07 15:09:58

标签: c# .net sockets socketexception

我正在尝试使用ScketType.Raw设置套接字通信(我需要与之通信的设备发送我自己的标头和校验和)。我是套接字连接的新手,也是Raw套接字类型的新手,我在设置它时遇到了麻烦。

我对SocketType.Stream的代码和IP地址/端口组合工作正常,但是使用SocketType.Raw失败了。使用SocketType.Raw设置套接字连接还需要哪些其他信息?

string txtPort = tbPort.Text;
string txtIP = tbIPAddress.Text;
int port = System.Convert.ToInt16(txtPort);
ip = IPAddress.Parse(txtIP);
ipEnd = new IPEndPoint(ip, port);

// this works but doesn't suit my needs
//MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//MainSocket.Connect(ipEnd);

// This fails: An invalid argument was supplied (ip address and port of the device I am connecting to)
MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Tcp);
MainSocket.Connect(ipEnd);

2 个答案:

答案 0 :(得分:3)

您正在尝试创建使用TCP协议号的原始套接字;即,您正在尝试提供自己的TCP实现。

您无法创建使用TCP协议的原始套接字;管理和正确实施TCP协议需要操作系统提供全面支持,这是您在实施TCP时无法提供的支持。

您仍然可以为UDP或IP本身创建原始套接字;在IP本身的情况下,您无法从协议编号设置为TCP的原始套接字传输数据包。

来自MSDN

  

原始套接字的限制

     

在Windows 7,Windows Vista,Windows XP Service Pack 2(SP2)和Windows XP Service Pack 3(SP3)上,通过原始套接字发送流量的功能受到多种限制:

     
      
  • 无法通过原始套接字发送TCP数据。
  •   

答案 1 :(得分:0)

好奇,ProtocolType.IPv4有用吗?例如

MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IPv4);