不久前,我创建了一个类来处理我的LAN网络程序。我最近将我的一台笔记本电脑升级到了IPv4 7,并意识到Windows7(或者至少是我设置的方式)只支持IPv6,但我的台式机还是回到了windows xp时代,只使用Windows7。我创建的类使用UdpClient类,当前设置为只使用IPv4。有没有办法修改我的代码以允许发送和接收IPv6和IPv4数据包?很难删除类的代码,我的很多程序都依赖于这个类。我希望保持类的原始状态,因此我不需要修改我的旧程序,只需将旧类切换为更新后的类即可。
谢谢你的帮助,麦克斯
发送:
using System.Net.Sockets;UdpClient tub = new UdpClient ();
tub.Connect ( new IPEndPoint ( ToIP, ToPort ) );
UdpState s = new UdpState ();
s.client = tub;
s.endpoint = new IPEndPoint ( ToIP, ToPort );
tub.BeginSend ( data, data.Length, new AsyncCallback ( SendCallBack ),s);
private void SendCallBack ( IAsyncResult result )
{
UdpClient client = (UdpClient)( (UdpState)( result.AsyncState ) ).client;
IPEndPoint endpoint = (IPEndPoint)( (UdpState)( result.AsyncState ) ).endpoint;
client.EndSend ( result );
}
接收:
UdpClient tub = new UdpClient (ReceivePort);
UdpState s = new UdpState ();
s.client = tub;
s.endpoint = new IPEndPoint ( ReceiveIP, ReceivePort );
s.callback = cb;
tub.BeginReceive ( new AsyncCallback ( receivedPacket ), s );
public void receivedPacket (IAsyncResult result)
{
UdpClient client = (UdpClient)( (UdpState)( result.AsyncState ) ).client;
IPEndPoint endpoint = (IPEndPoint)( (UdpState)( result.AsyncState ) ).endpoint;
Byte[] receiveBytes = client.EndReceive ( result, ref endpoint );
Packet ThePacket = new Packet ( receiveBytes );
client.Close();
//Do what ever with the 'ThePacket' now
}
发布于 2010-03-17 03:20:03
发布于 2018-10-23 06:25:09
通过提供UdpClient套接字,可以准备在IPv4和IPv6上接收DualMode:
socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234));
var udpClient = new UdpClient();
udpClient.Client = socket;
... (use udpClient)
发送更容易,我们可以使用指定的目标地址(IPv4或IPv6)创建UdpClient。如果需要,可以在构造函数中提供AddressFamily。
https://stackoverflow.com/questions/2459240
复制