C# 4.0 如何在多播组中发送消息(有线到无线)
我的项目是让两个设备相互通信,一个是笔记本电脑,另一个是台式机,使用c#中的Sockets类。笔记本电脑通过无线连接连接到路由器,而台式电脑连接到LAN或有线连接到同一路由器 问题是当我让笔记本电脑向桌面发送数据时,桌面没有收到任何数据。但当我尝试通过另一台通过无线连接的笔记本电脑发送信息时,第一台笔记本电脑能够接收另一台笔记本电脑发送的数据C# 4.0 如何在多播组中发送消息(有线到无线),c#-4.0,network-programming,C# 4.0,Network Programming,我的项目是让两个设备相互通信,一个是笔记本电脑,另一个是台式机,使用c#中的Sockets类。笔记本电脑通过无线连接连接到路由器,而台式电脑连接到LAN或有线连接到同一路由器 问题是当我让笔记本电脑向桌面发送数据时,桌面没有收到任何数据。但当我尝试通过另一台通过无线连接的笔记本电脑发送信息时,第一台笔记本电脑能够接收另一台笔记本电脑发送的数据 using System; using System.Collections.Generic; using System.Linq; using Syst
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Collections;
namespace gslib
{
public class StateObject
{
private Socket m_socket;
private byte[] m_data;
private StringBuilder m_message;
public StateObject()
{
m_message = new StringBuilder();
}
public Socket Socket
{
set { m_socket = value; }
get { return m_socket; }
}
public byte[] Data
{
set { m_data = value; }
get { return m_data; }
}
public StringBuilder Message
{
set { m_message = value; }
get { return m_message; }
}
}
public class GroupAgent
{
private const int BUFFERSIZE = 4096;
public GroupAgent()
{
m_ip = string.Empty;
m_port = -1;
}
public GroupAgent(string ip, int port)
{
m_ip = ip;
this.m_port = port;
}
#region decleration
private string m_ip;
private int m_port;
#endregion
#region events
public delegate void MessageRecievedEventhandler(string message);
public event MessageRecievedEventhandler MessageRecieved;
#endregion
#region private methods
private byte[] trimByte(byte[] receive, int x)
{
List<byte> temp = new List<byte>();
for (int i = 0; i < x; i++)
{
temp.Add(receive[i]);
}
return temp.ToArray();
}
private void receive(Socket sock)
{
StateObject state = new StateObject();
state.Socket = sock;
state.Data = new byte[BUFFERSIZE];
sock.BeginReceive(state.Data, 0, BUFFERSIZE, SocketFlags.None, new AsyncCallback(DoReceiveFrom), state);
}
private void DoReceiveFrom(IAsyncResult iar)
{
StateObject state = (StateObject)iar.AsyncState;
try
{
int count = state.Socket.EndReceive(iar);
byte[] temp = trimByte(state.Data, count);
if (MessageRecieved != null)
{
MessageRecieved(ASCIIEncoding.ASCII.GetString(temp));
}
state.Socket.BeginReceive(state.Data, 0, BUFFERSIZE, SocketFlags.None, new AsyncCallback(DoReceiveFrom), state);
}
catch
{
state.Socket.BeginReceive(state.Data, 0, BUFFERSIZE, SocketFlags.None, new AsyncCallback(DoReceiveFrom), state);
}
}
#endregion
#region public properties
public string _GroupIP
{
set { m_ip = value; }
get { return m_ip; }
}
public int _Port
{
set { m_port = value; }
get { return m_port; }
}
#endregion
#region public methods
public void connect()
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
sock.Bind(new IPEndPoint(IPAddress.Any, _Port));
sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new
MulticastOption(IPAddress.Parse(_GroupIP), IPAddress.Any));
sock.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.MulticastTimeToLive, 2);
receive(sock);
}
public void connect(string m_ip, int port)
{
_GroupIP = m_ip;
_Port = port;
connect();
}
public void sendMessage(string message)
{
byte[] msg = ASCIIEncoding.ASCII.GetBytes(message);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new
MulticastOption(IPAddress.Parse(_GroupIP)));
sock.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.MulticastTimeToLive, 2);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(_GroupIP), _Port);
sock.Connect(iep);
sock.Send(msg);
sock.Close();
}
#endregion
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Net.Sockets;
Net系统;
使用系统集合;
命名空间gslib
{
公共类状态对象
{
专用插座m_插座;
专用字节[]m_数据;
私有StringBuilder m_消息;
公共状态对象()
{
m_message=新的StringBuilder();
}
公用插座
{
设置{m_socket=value;}
获取{return m_socket;}
}
公共字节[]数据
{
设置{m_data=value;}
获取{return m_data;}
}
公共StringBuilder消息
{
设置{m_message=value;}
获取{return m_message;}
}
}
公共类组代理
{
private const int BUFFERSIZE=4096;
公共团体代理()
{
m_ip=string.Empty;
m_端口=-1;
}
公共GroupAgent(字符串ip,int端口)
{
m_ip=ip;
this.m_port=端口;
}
#区域性消肿
私有字符串m_ip;
私人国际港口;
#端区
#地区活动
公共委托无效消息ReceiveDevenHandler(字符串消息);
公共事件消息ReceivedEventHandler消息Received;
#端区
#区域私有方法
专用字节[]三字节(字节[]接收,整数x)
{
列表温度=新列表();
对于(int i=0;i
我这里缺少什么?。我必须在我的路由器上设置什么吗?。请回复
sock.Bind(new IPEndPoint(IPAddress.Any, _Port));
问题就在这里。这会导致UDP根据单播IP路由表路由传出数据报,如果路由表不喜欢无线路由,则不会使用它。将其绑定到本地wifi接口的IP地址。当我将其绑定到无线接口时,我无法再接收或发送数据。。。对这个有什么建议吗?。注意:im使用多播组IP进行通信,顺便说一下,感谢您的回复。要通过所有接口接收,您必须通过所有接口加入该组。INADDR_ANY也不足以做到这一点。你能告诉我通过所有接口加入团队的正确方法吗?非常感谢。m_ip和port.m_ip=224.0.1.0 port=1234的值是多少