关于c#中UDP编程

关于c#中UDP编程,第1张

//这是一个源码你看看

using System

using System.Net

using System.Net.Sockets

using System.Text

using System.Threading

using System.Windows.Forms

namespace UDPClient

{

public partial class frmUdp : Form

{

private UdpClient sendUdpClient

private UdpClient receiveUpdClient

public frmUdp()

{

InitializeComponent()

IPAddress[] ips = Dns.GetHostAddresses("")

tbxlocalip.Text = ips[3].ToString()

int port = 51883

tbxlocalPort.Text = port.ToString()

tbxSendtoIp.Text = ips[3].ToString()

tbxSendtoport.Text = port.ToString()

}

// 接受消息

private void btnReceive_Click(object sender, EventArgs e)

{

// 创建接收套接

IPAddress localIp = IPAddress.Parse(tbxlocalip.Text)

IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse(tbxlocalPort.Text))

receiveUpdClient = new UdpClient(localIpEndPoint)

Thread receiveThread = new Thread(ReceiveMessage)

receiveThread.Start()

}

// 接收消息方法

private void ReceiveMessage()

{

IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0)

while (true)

{

try

{

// 关闭receiveUdpClient时此时会产生异常

byte[] receiveBytes = receiveUpdClient.Receive(ref remoteIpEndPoint)

string message = Encoding.Unicode.GetString(receiveBytes)

// 显示消息内容

ShowMessageforView(lstbxMessageView, string.Format("{0}[{1}]", remoteIpEndPoint, message))

}

catch

{

break

}

}

}

// 利用委托回调机制实现界面上消息内容显示

delegate void ShowMessageforViewCallBack(ListBox listbox, string text)

private void ShowMessageforView(ListBox listbox, string text)

{

if (listbox.InvokeRequired)

{

ShowMessageforViewCallBack showMessageforViewCallback = ShowMessageforView

listbox.Invoke(showMessageforViewCallback, new object[] { listbox, text })

}

else

{

lstbxMessageView.Items.Add(text)

lstbxMessageView.SelectedIndex = lstbxMessageView.Items.Count - 1

lstbxMessageView.ClearSelected()

}

}

private void btnSend_Click(object sender, EventArgs e)

{

if (tbxMessageSend.Text == string.Empty)

{

MessageBox.Show("发送内容不能为空","提示")

return

}

// 选择发送模式

if (chkbxAnonymous.Checked == true)

{

// 匿名模式(套接字绑定的端口由系统随机分配)

sendUdpClient = new UdpClient(0)

}

else

{

// 实名模式(套接字绑定到本地指定的端口)

IPAddress localIp = IPAddress.Parse(tbxlocalip.Text)

IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse(tbxlocalPort.Text))

sendUdpClient = new UdpClient(localIpEndPoint)

}

Thread sendThread = new Thread(SendMessage)

sendThread.Start(tbxMessageSend.Text)

}

// 发送消息方法

private void SendMessage(object obj)

{

string message = (string)obj

byte[] sendbytes = Encoding.Unicode.GetBytes(message)

IPAddress remoteIp = IPAddress.Parse(tbxSendtoIp.Text)

IPEndPoint remoteIpEndPoint = new IPEndPoint(remoteIp, int.Parse(tbxSendtoport.Text))

sendUdpClient.Send(sendbytes, sendbytes.Length, remoteIpEndPoint)

sendUdpClient.Close()

// 清空发送消息框

ResetMessageText(tbxMessageSend)

}

// 采用了回调机制

// 使用委托实现跨线程界面的 *** 作方式

delegate void ResetMessageCallback(TextBox textbox)

private void ResetMessageText(TextBox textbox)

{

// Control.InvokeRequired属性代表

// 如果控件的处理与调用线程在不同线程上创建的,则为true,否则为false

if (textbox.InvokeRequired)

{

ResetMessageCallback resetMessagecallback = ResetMessageText

textbox.Invoke(resetMessagecallback, new object[] { textbox })

}

else

{

textbox.Clear()

textbox.Focus()

}

}

// 停止接收

private void btnStop_Click(object sender, EventArgs e)

{

receiveUpdClient.Close()

}

// 清空接受消息框

private void btnClear_Click(object sender, EventArgs e)

{

this.lstbxMessageView.Items.Clear()

}

}

}

10054是“连接被重置”

你确定一下你发送数据包的目的端点是不是有在监听这个端口,如果没有,那么对方主机会发一个代表错误的数据包过来,然后你的recvfrom就失败了(返回-1)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7820688.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-10
下一篇2023-04-10

发表评论

登录后才能评论

评论列表(0条)

    保存