自己琢磨老半天,本地可以发给自己,可是发给隔壁宿舍的朋友,就没办法一起聊天。见鬼。给一个可行的代码,或者……帮我修改下代码。万分感谢!
解决方案 »
- C#如何获取windows正在运行的进程
- PictureBox.Image 为null
- 大家好,我想问个VisualStudio快捷键的
- 运行VS2005时,屏幕会黑一下,然后鼠标的样式就变得很难控制。VS里面的文件显示得也不正常。
- 重金求一个项目:关于视频图像采集识别的,有志者请进!
- 怎么构造GetBulkRequest报文及处理返回的报文呢?
- File.Create();在vs.net里正常运行但到 IIS上就有异常 怎么回事呀
- =====另一个 SqlParameterCollection 已包含带有 ParameterName“@value1”的 SqlParameter。 ===
- 兄弟们如何在WINFORM(C#)中设置像文本框、命令按钮等这样控件的样式啊!
- C#控制台应用程序做棋牌游戏靠谱不?
- 正则表达式来者送分啦
- 大哥大姐进来看看,这个问题我不知道该怎么问!
private void button_Send_Click(object sender, EventArgs e)
{
string str = RTB_Message.Text.Trim();
if (str.Length == 0) return;
Send(str);
} void Send(string msg)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);//255.255.255.255
IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);
string hostname = Dns.GetHostName();
byte[] data = Encoding.Unicode.GetBytes(msg);
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
//sock.SendTo(data, iep1);
sock.SendTo(data, iep2);
sock.Close();
} bool b = true; void Connection()
{ Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
sock.Bind(iep);
Writes("Ready to receive…");
while (b)
{
EndPoint ep = (EndPoint)iep;
byte[] data = new byte[1024];
int recv = sock.ReceiveFrom(data, ref ep);
string stringData = Encoding.Unicode.GetString(data, 0, recv); //Writes(string.Format("\nreceived1: from: {0}\n{1}", ep, stringData)); //stringData = Encoding.Unicode.GetString(data, 0, recv); Writes(string.Format("\nreceived2: from: {0}\n{1}", ep, stringData));
}
sock.Close();
//Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 4567);
//socket.Bind(ipe);
//IPAddress ip = IPAddress.Parse("239.255.255.1");
//socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, IPAddress.Any)); //while (b)
//{
// byte[] buffer = new byte[2048];
// socket.Receive(buffer); // string str = Encoding.Unicode.GetString(buffer).Trim('\u0000');
// if (str == "System|Iamclose()")
// {
// str = "该IP已经下线了!!";
// }
// Writes(string.Format("\t\n对方IP:{0}时间:{1}\t\n{2}", ipe.Address,DateTime.Now.ToLongTimeString(), str));
//}
}
void Writes(string str)
{
if (RTB_Content.InvokeRequired)
RTB_Content.Invoke(new DE(Writes), new object[] { str });
else
RTB_Content.Text += str;
}
delegate void DE(string str);
Thread t;
private void Form1_Load(object sender, EventArgs e)
{
t = new Thread(Connection);
t.IsBackground = true;
t.Start();
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
b = false;
Send("对方已关闭连接……");
} private void RTB_Message_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.Enter)
{
button_Send_Click(null, null);
RTB_Message.Focus();
RTB_Message.Clear();
e.Handled = true;
}
}
版本1
private int SenderPort = 8080;
/// <summary>
/// 本地IP。
/// </summary>
private int LocalPort;
/// <summary>
/// 远程IP。
/// </summary>
private int RemotePort; private string m_szHostName;
/// <summary>
/// 广播对象。
/// </summary>
private IPAddress m_GroupAddress;
/// <summary>
/// 解析主机。
/// </summary>
private IPHostEntry m_LocalHost;
/// <summary>
/// 远程终结点。
/// </summary>
private IPEndPoint m_RemoteEP; /// <summary>
///完成侦听。
/// </summary>
private bool m_Done = false; public Form2()
{
InitializeComponent();
}
delegate void WriteDelegate(string msg);
private void WriteWord(string msg)
{
if (RTB_Content.InvokeRequired)
RTB_Content.Invoke(new WriteDelegate(WriteWord), new object[] { msg });
else
RTB_Content.Text += msg + "\r\n";
}
Thread t = null;
private void Form2_Load(object sender, EventArgs e)
{
LocalPort = SenderPort;
RemotePort = ListenerPort; m_szHostName = Dns.GetHostName();//获取本地计算机名。
m_LocalHost = Dns.GetHostEntry(m_szHostName); //解析主机 WriteWord(string.Format("本地端口:{0},远程端口:{1}……", LocalPort, RemotePort));
WriteWord("正在初始化……"); Initialize(); //初始化本机以及加入广播组。 WriteWord("正在启动侦听器线程……"); t = new Thread(new ThreadStart(Listener));//建立线程
t.IsBackground = true;
t.Start();//开始侦听。
} public void Initialize()
{ //
// 实例化 UdpCLient
//
m_Client = new UdpClient(LocalPort);
//
// 创建多路广播组对象
//
m_GroupAddress = IPAddress.Parse("224.224.224.224"); //
// 联接组
//
try
{
m_Client.JoinMulticastGroup(m_GroupAddress, 100);
}
catch (Exception)
{
Console.WriteLine("无法联接多路广播组");
} //
// 创建对方主机的终结点
//
m_RemoteEP = new IPEndPoint(m_GroupAddress, RemotePort); } public void Listener()
{
//
// 侦听器等待数据到来
// 并用缓冲区保存它。
Thread.Sleep(2000); // 确保 client2 正在接收 Encoding Default = Encoding.Default; while (!m_Done)
{
IPEndPoint endpoint = null;//对方主机
Byte[] data = m_Client.Receive(ref endpoint);//返回对方的IP,进行初始化。并返回数据。 String strData = Default.GetString(data); if (strData.IndexOf(":@") > 0)
{
//
// 我们接收到一个终止指示,
// 现在我们必须确定它是来
// 自我们的主线程的关闭,
// 还是来自其他地方
//
Char[] separators = { ':' };
String[] vars = strData.Split(separators); if (vars[0] == m_szHostName)
{
//
// 这是来自我们自己的线程,因此
// 立即结束
//
WriteWord("正在关闭侦听器线程 "); //
// 此过程应已由主线程完成了,但为
// 安全起见,我们再执行一次
//
m_Done = true;
}
else
{
//
// 这是来自其他地方的
//
WriteWord(string.Format("{0} 已离开对话", vars[0]));
}
}
else
{
//
// 这是从其他地方以及我们自己
// 处接收到的正常数据
// 在输出前,查看它是否来自我
// 们自己
//
if (strData.IndexOf(":") > 0)
{
Char[] separators = { ':' };
String[] vars = strData.Split(separators); //if (vars[0] != m_szHostName)
//{
WriteWord(strData);//可以接收自己的信息。
//}
}
}
}
WriteWord("侦听器线程已完成 ");
} private void button_Send_Click(object sender, EventArgs e)
{
string str = RTB_Message.Text.Trim();
if (str.Length == 0) return;
Send(str); } void Send(string s)
{
Byte[] buffer = null;
Encoding Default = Encoding.Default; s = m_szHostName + ":" + s;
buffer = new Byte[s.Length * 2 + 2];
//
// 将数据发送给远程对方主机
// int len = Default.GetBytes(s.ToCharArray(), 0, s.Length, buffer, 0); int ecode = m_Client.Send(buffer, len, m_RemoteEP); if (ecode <= 0)
{
WriteWord("发送时出错:" + ecode);
}
} private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
Send("@");
t.Abort();
t.Join(); WriteWord("正在关闭连接 "); Terminate(); } public void Terminate()
{
m_Client.DropMulticastGroup(m_GroupAddress);
} private void RTB_Message_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.Enter)
{
button_Send_Click(null, null);
RTB_Message.Focus();
RTB_Message.Clear();
e.Handled = true;
}
}版本2
http://blog.csdn.net/zgke/archive/2009/01/20/3838844.aspx
http://www.codeproject.com/KB/IP/Genesis.aspx
感兴趣的请联系我
email:[email protected]
msn: [email protected]