Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.211.66] |
|
Сообщ.
#1
,
|
|
|
Имееться:
Microsoft Visual Studio 2005 Язык - C# Задача: Написать класс, который будет создавать UDP сокет - клиент, слать Broadcast сообщения и получать ответ (ответ не Broadcast). Трудности: Запрос посылается, ответ сервером высылается но я его не могу получить Мож чо не так делаю? Подскажите кто знает!!! Вот код Исходный код EndPoint EP; IPEndPoint ipEP; private Socket WorkSocket; private class StateObject { public Socket workSocket = null; public const int BufferSize = 10240; public byte[] buffer = new byte[BufferSize]; } StateObject state = new StateObject(); public void Connect() { ipEP = new IPEndPoint(IPAddress.Parse("255.255.255.255"), Port); EP = (EndPoint)ipEP; WorkSocket = new Socket(ipEP.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp); WorkSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); WorkSocket.EnableBroadcast = true; WorkSocket.Blocking = false; WorkSocket.BeginConnect(EP, new AsyncCallback(ConnectCallback), WorkSocket); } private void ConnectCallback(IAsyncResult ar) { Socket client = (Socket)ar.AsyncState; client.EndConnect(ar); this.ReceiveThread();//запускаем функцию прослушивания, если она инициализирована или прервана } private void ReceiveThread() { state.workSocket = WorkSocket; this.WorkSocket.BeginReceiveFrom(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, ref EP, new AsyncCallback(ReceiveCallback), state); } private void ReceiveCallback(IAsyncResult ar) { // Retrieve the state object and the client socket // from the asynchronous state object. StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; // Read data from the remote device. int bytesRead; bytesRead = client.EndReceiveFrom(ar, ref EP); if (bytesRead > 0) { this.ReceiveThread(); } } public void SendTo(byte[] Buf, int CountBytes, System.Net.EndPoint EPtmp) { WorkSocket.BeginSendTo(Buf, 0, CountBytes, SocketFlags.None, ipEP, new AsyncCallback(SendCallback), WorkSocket); } private void SendCallback(IAsyncResult ar) { // Retrieve the socket from the state object. Socket client = (Socket)ar.AsyncState; // Complete sending the data to the remote device. int bytesSent = client.EndSend(ar); } |
Сообщ.
#2
,
|
|
|
Но вот такая конструкция работает
IPEndPoint MyPoint; EndPoint RemotePoint; // тута инициализация сокета+++ public cUDP() { MyPoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 40000); RemotePoint = (EndPoint)MyPoint; try { WorkSock = new Socket(MyPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp); WorkSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); WorkSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000); } catch (Exception e) { } } // тута инициализация сокета--- // функция отправки сообщения и получения ответа public void Send(byte[] Buf, int CB) { try { WorkSock.SendTo(Buf, CB, SocketFlags.None, MyPoint); } catch (Exception e) { return; } byte[] tmp = new byte[WorkSock.SendBufferSize]; try { CB = WorkSock.ReceiveFrom(tmp, ref RemotePoint); } catch (Exception e) { return; } } Но это "синхронная" реализация, а нужна асинхронная... |
Сообщ.
#3
,
|
|
|
Так и пришлось использовать потоки...
|