using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace UdpServer { public partial class Server : Form { public Server() { Control.CheckForIllegalCrossThreadCalls = false; InitializeComponent(); } Socket connectionSocket = null; private void btnStart_Click(object sender, EventArgs e) { connectionSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(txtIp.Text.Trim()), Convert.ToInt32(txtPort.Text.Trim())); connectionSocket.Bind(iPEndPoint); Thread acceptThread = new Thread(Accept); acceptThread.IsBackground = true; acceptThread.Start(); } void Accept() { while (true) { byte[] by = new byte[1024]; IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint iPEndPoint = (EndPoint)sender; int rev = connectionSocket.ReceiveFrom(by, ref iPEndPoint); txtReceiveMsg.AppendText(DateTime.Now + " " + iPEndPoint.ToString() + " 说:" + System.Text.Encoding.Default.GetString(by, 0, rev) + "\r\n"); } } Socket sendSocket = null; private void btnSend_Click(object sender, EventArgs e) { sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(txtIp.Text.Trim()), 10002); EndPoint endPoint = (EndPoint)iPEndPoint; sendSocket.SendTo(System.Text.Encoding.Default.GetBytes(txtSendMsg.Text.Trim()), iPEndPoint); } } }
发的是服务端代码,客户端代码和服务端代码几乎一样 只是端口改下而已,希望高手帮忙解答下。就是为什么客户端或者服务端接收到对方的信息后,端口为什么会变而不是绑定的端口?
就你這個代碼,應該是用一個connectionSocket,不要發送的時候,再生成一個socket。
因为在服务端有两个Socket对象,一个负责接收连接请求,另一个负责通信(接发信息)。
Bind方法绑定的是接受用的端口,并不是发送用的端口