如何使用原始套接字类型设置套接字

How to set up a socket using raw sockettype

我正在尝试使用 ScketType.Raw 设置套接字通信(我正在与之通信的设备有必要发送我自己的 header 和校验和)。我是套接字连接的新手,也是原始套接字类型的新手,在设置时遇到了问题。

我的代码和 IP address/port 组合适用于 SocketType.Stream,但无法使用 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);

只是好奇,ProtocolType.IPv4 有效吗?例如

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

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

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

您仍然可以为 UDP 或 IP 本身创建原始套接字;对于 IP 本身,您不能从原始套接字传输协议号设置为 TCP 的数据包。

来自MSDN

Limitations on Raw Sockets

On Windows 7, Windows Vista, Windows XP with Service Pack 2 (SP2), and Windows XP with Service Pack 3 (SP3), the ability to send traffic over raw sockets has been restricted in several ways:

  • TCP data cannot be sent over raw sockets.