udp套接字编程实验总结与体会(udp套接字)

http://www.itjxue.com  2023-02-11 00:46  来源:未知  点击次数: 

关于c#中UDP编程

//这是一个源码你看看

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();

}

}

}

简述基于TCP和UDP的Socket编程的异同

Socket有两种主要的操作方式:面向连接的和无连接的。无连接的操作使用UDP数据报协议,这个操作不需要连接一个目的的socket,它只是简单地投出数据报,快速高效,但缺少数据安全性。面向连接的操作使用TCP协议,一个这个模式的socket必须在发送数据之前与目的地的socket取得一个连接,一旦连接建立了,socket就可以使用一个流接口:打开-读-写-关闭,所有的发送的信息都会在另一端以同样的顺序被接收,面向连接的操作比无连接的操作效率要低,但数据的安全性更高。基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM).

流式套接字的设计是针对面向连接的网络应用,在数据传输之前需要预先建立连接,在数据传输过程中需要维持连接,在数据传输结束后需要释放连接。由于采用校验和、确认与超时等差错控制手段,因此流式套接字可以保证数据传输的正确性。

数据报套接字(SOCK_DGRAM)提供无连接的、不可靠的数据传输服务,实际上它是基于TCP/IP协议族中的UDP协议实现的。数据报套接字提供无序、有差错与有重复的数据流服务。数据报套接字的设计是针对无连接的网络应用,在数据传输之前不需要预先建立连接。由于只采用很有限的差错控制手段,因此数据报套接字无法保证数据传输的正确性。

什么是udp套接字?

UDP套接字

UDP协议提供了一种不同于TCP协议的端到端服务。实际上UDP协议只实现两个功能:

1)在IP协议的基础上添加了另一层地址(端口)

2)对数据传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。

由于其简单性,UDP套接字具有一些与我们之前所看到的TCP套接字不同的特征。

例如,UDP套接字在使用前不需要进行连接。TCP协议与电话通信相似,而UDP协议则与邮件通信相似:你寄包裹或信件时不需要进行"连接",但是你得为每个包裹和信件指定目的地址。类似的,每条信息(即数据报文,datagram)负载了自己的地址信息,并与其他信息相互独立。在接收信息时,UDP套接字扮演的角色就像是一个信箱,从不同地址发送来的信件和包裹都可以放到里面。一旦被创建,UDP套接字就可以用来连续地向不同的地址发送信息,或从任何地址接收信息。

UDP套接字与TCP套接字的另一个不同点在于他们对信息边界的处理方式不同:UDP套接字将保留边界信息。这个特性使应用程序在接受信息时,从某些方面来说比使用TCP套接字更简单。

最后一个不同点是,UDP协议所提供的端到端传输服务是尽力而为(best-effort)的,即UDP套接字将尽可能地传送信息,但并不保证信息一定能成功到达目的地址,而且信息到达的顺序与其发送顺序不一定一致(就像通过邮政部门寄信一样)。因此,使用了UDP套接字的程序必须准备好处理信息的丢失和重排。(稍后我们将给出一个这样的例子)

既然UDP协议为程序带来了这个额外的负担,为什么还会使用它而不使用TCP协议呢?

原因之一是效率:如果应用程序只交换非常少量的数据,例如从客户端到服务器端的简单请求消息,或一个反方向的响应消息,TCP连接的建立阶段就至少要传输其两倍的信息量(还有两倍的往返延迟时间)。

另一个原因是灵活性:如果除可靠的字节流服务外,还有其他的需求,UDP协议则提供了一个最小开销的平台来满足任何需求的实现。

UDP套接字编程(C++)求注释

这个需要一本书讲的,这里讲不清的。很多关于套接字的书unix程序猿建议看APUEwindows程序猿建议看《VC技术内幕》

(责任编辑:IT教学网)

更多

推荐图片影音文章