我正在尝试使用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);
答案 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);