[英]UDP socket unable to send packet to DHCP address
我創建了簡單的 UDP 套接字連接來在本地網絡之間發送數據。 連接有兩種類型:點對點和組廣播。 以下是我的課程:點對點服務器:
public class CandyCaneUdpServer
{
Socket sck;
EndPoint LocalEP;
EndPoint RemoteEP;
int port = 80;
IAsyncResult oldAsyncResult;
public event EventHandler<MessageObject> RaiseMessageReceivedEvent;
public CandyCaneUdpServer()
{
sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
sck.ExclusiveAddressUse = false;
LocalEP = new IPEndPoint(IPAddress.Parse(UdpUtility.GetLocalIP()), port);
RemoteEP = new IPEndPoint(IPAddress.Any, port);
}
public void Serve()
{
sck.Bind(LocalEP);
byte[] _buffer = new byte[1500];
oldAsyncResult = sck.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref RemoteEP, new AsyncCallback(MessageCallBack), _buffer);
}
private void MessageCallBack(IAsyncResult aResult)
{
int size = sck.EndReceiveFrom(aResult, ref RemoteEP);
if (size > 0)
{
byte[] receivedData;
receivedData = (byte[])aResult.AsyncState;
MessageObject obj;
IFormatter f = new BinaryFormatter();
using (MemoryStream s = new MemoryStream(receivedData))
{
obj = (MessageObject)f.Deserialize(s);
}
OnRaiseMessageReceivedEvent(obj);
}
var _buffer = new byte[1500];
oldAsyncResult = sck.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref RemoteEP, new AsyncCallback(MessageCallBack), _buffer);
}
protected virtual void OnRaiseMessageReceivedEvent(MessageObject e)
{
EventHandler<MessageObject> handler = RaiseMessageReceivedEvent;
if (handler != null)
{
handler(this, e);
}
}
}
以下是點對點客戶端(發送方):
public class CandyCaneUdpClient
{
Socket sck;
EndPoint RemoteEP;
public CandyCaneUdpClient(string RemoteIP, int RemotePort)
{
sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
sck.ExclusiveAddressUse = false;
RemoteEP = new IPEndPoint(IPAddress.Parse(RemoteIP), RemotePort);
}
public void Send(int MessageId, string Message, __MessageObjectType t = __MessageObjectType.P2P)
{
byte[] msg;
msg = Encoding.UTF8.GetBytes(Message);
var obj = new MessageObject()
{
Id = MessageId,
Type = t,
SourceIP = UdpUtility.GetLocalIP(),
TargetIP = ((IPEndPoint)RemoteEP).Address.ToString(),
SentTime = DateTime.Now,
Message = Message
};
IFormatter f = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
f.Serialize(ms, obj);
var msgByte = ms.ToArray();
sck.SendTo(msgByte, msgByte.Length, SocketFlags.None, RemoteEP);
}
}
}
該代碼適用於所有以太網機器。 連接wifi客戶端后,無線pc可以發送數據,不能接收數據。 當我檢查 IP 時,以太網客戶端的 IP 為 192.168.211.---。 而無線 pc 的 IP 為 192.168.0.---。 我想知道 DHCP 地址是否會導致問題。 群聊工作正常。
public class CandyCaneUdpGroupChatListener
{
UdpClient listener;
IPAddress routerBindIP;
readonly int routerBindPort = UdpUtility.GroupChatDefinedPort();
EndPoint routerEP, senderEP;
public event EventHandler<MessageObject> RaiseMessageReceivedEvent;
public CandyCaneUdpGroupChatListener()
{
routerBindIP = IPAddress.Parse(UdpUtility.GroupChatRouterBindAddress());
routerEP = new IPEndPoint(routerBindIP, routerBindPort);
senderEP = new IPEndPoint(IPAddress.Parse(UdpUtility.GetLocalIP()), routerBindPort);
listener = new UdpClient();
listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
listener.ExclusiveAddressUse = false;
listener.Client.Bind(senderEP);
listener.JoinMulticastGroup(routerBindIP);
var _buffer = new byte[1500];
listener.Client.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref routerEP,
new AsyncCallback(ReceiveMessage), _buffer);
}
private void ReceiveMessage(IAsyncResult result)
{
if (listener == null) return;
if (listener.Client == null) return;
int size = listener.Client.EndReceiveFrom(result, ref routerEP);
if (size > 0)
{
byte[] receivedData;
receivedData = (byte[])result.AsyncState;
MessageObject obj;
IFormatter f = new BinaryFormatter();
using (MemoryStream s = new MemoryStream(receivedData))
{
obj = (MessageObject)f.Deserialize(s);
//if (obj.SourceIP == UdpUtility.GetLocalIP()) return;
}
MessageReceived(obj);
}
var _buffer = new byte[1500];
listener.Client.BeginReceiveFrom(_buffer, 0, _buffer.Length, SocketFlags.None, ref routerEP,
new AsyncCallback(ReceiveMessage), _buffer);
}
protected virtual void MessageReceived(MessageObject e)
{
EventHandler<MessageObject> handler = this.RaiseMessageReceivedEvent;
if (handler != null)
{
handler(this, e);
}
}
public void Disconnect()
{
listener.DropMulticastGroup(routerBindIP);
}
}
查看您如何布置有線和無線網絡子網。 看起來您有兩個不同的 DHCP 服務器在這里工作 - 一個用於有線網絡,另一個用於無線網絡。
確保您的網絡路由器配置為一個子網上的主機可以與另一個子網上的主機通信。
要確定一個子網上的主機是否可以與另一個子網上的主機通信,您可以使用網絡跟蹤路由實用程序或 ping 實用程序。
在 Windows 上,跟蹤路由是作為tracert.exe
應用程序實現的,您可以在C:\\Windows\\System32
目錄中找到它。
假設您在以太網連接的客戶端上,您可以使用以下命令行執行它以嘗試跟蹤到無線 PC 的路由(假設它的地址為 192.168.0.104):
C:> \Windows\System32\tracert.exe 192.168.0.104
您應該會看到與此類似的輸出:
Tracing route to 192.168.0.104
over a maximum of 30 hops:
1 1 ms 1 ms <1 ms 192.168.211.54
... (possibly other entries her)
2 1 ms 1 ms 1 ms 192.168.0.104
Trace complete.
如果跟蹤未能完成,則表明您的網絡流量無法到達您嘗試跟蹤的機器。
請注意,如果tracert
失敗,則不是 100% 表示連接失敗。 這可能表明 ICMP 流量被防火牆阻止或目標計算機未響應 ICMP 請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.