今天早上我问了一个问题,这是链接-thread interrupt in udp
但是在这个问题上花了更多时间后-我得出的结论是,我需要做的是-
我需要创建一个udp服务器,其工作是侦听和接收来自端口1200的数据。 并且我需要创建另一个udp套接字以使用任何其他端口发送数据。
我希望此udp侦听器连续作为后台进程进行侦听。 所以我尝试这样做,但是却遇到了这个错误-而且该声明还说,使用sendto方法发送数据时甚至没有在这里发送任何数据。
“由于未连接套接字,并且(未使用sendto调用在数据报套接字上发送时,未提供地址),因此不允许发送或接收数据的请求”
StackTrace " at System.Net.Sockets.Socket.get_RemoteEndPoint()" string SocketErrorCode NotConnected System.Net.Sockets.SocketError
我使用此代码在任何远程客户端的端口1200上接收-
public void button1_Click()
{
this.serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
this.serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
this.serverSocket.Bind(new IPEndPoint(IPAddress.Any, this.port));
EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
this.serverSocket.BeginReceiveFrom(this.byteData, 0, this.byteData.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, serverSocket);
}
private void DoReceiveFrom(IAsyncResult iar)
{
try
{
EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
int dataLen = 0;
byte[] data = null;
try
{
dataLen = this.serverSocket.EndReceiveFrom(iar, ref clientEP);
data = new byte[dataLen];
Array.Copy(this.byteData, data, dataLen);
string ips = ((IPEndPoint)clientEP).Address.ToString();
server sss = new server();
sss.updateData(data, ips);
}
catch (Exception e)
{
}
finally
{
EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
this.serverSocket.BeginReceiveFrom(this.byteData, 0, this.byteData.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, serverSocket);
}
if (!this.clientList.Any(client => client.Equals(clientEP)))
this.clientList.Add(clientEP);
string s = Encoding.ASCII.GetString(data);
}
catch (Exception ex)
{
string m = ex.Message;
}
}
public void Stop()
{
this.serverSocket.Close();
this.serverSocket = null;
this.clientList.Clear();
}
我现在应该做什么?我的问题是这个- 我只想获取任何东西,只要1200接收到数据,然后从中找到远程IP,然后执行一些任务即可。我有执行类似操作的示例,但是它们在TCP上,TCP连接到每个设备,而UDP没有。
那么我该如何处理udp ??
代码已更新-
static void OnUdpData(IAsyncResult result)
{
// this is what had been passed into BeginReceive as the second parameter:
UdpClient socket = result.AsyncState as UdpClient;
// points towards whoever had sent the message:
IPEndPoint source = new IPEndPoint(0, 0);
// get the actual message and fill out the source:
byte[] message = socket.EndReceive(result, ref source);
string ip = source.Address.ToString();
server cs = new server();
cs.updateData(message, ip);
socket.BeginReceive(new AsyncCallback(OnUdpData), socket);
}
public static void ReceiveData()
{
UdpClient socket = new UdpClient(1200);
socket.BeginReceive(new AsyncCallback(OnUdpData), socket);
}
这可用于控制台应用程序,但不能以网络形式使用。作为套接字的抛出错误可以使用1次。
所以我又改变了几行-
public static void ReceiveData()
{
IPEndPoint iPEnd = new IPEndPoint(IPAddress.Any, 1200);
UdpClient socket = new UdpClient(iPEnd);
EndPoint ep = iPEnd;
socket.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
socket.Client.Bind(ep);
socket.BeginReceive(new AsyncCallback(OnUdpData), socket);
}
但这也给出了错误。那么为什么会这样呢? 如果代码可以在控制台应用程序中工作,那么为什么不能在Web窗体中使用?