Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Асинхронные сокеты 
:(
    Опции темы
argent
Дата 20.9.2010, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.9.2010

Репутация: нет
Всего: нет



Пишу на C# приложение, работающее с асинхронными сокетами. Смысл такой: есть 10 сокетов, подключенных к одному и тому же адресу, но забинденных (socket.Bind()) на 10 разных IPшников (на машине они имеются).
В цикле хочу делать следующее:
Код

while(true)
{
            Send(socks[i], "Hello");
            sendDone.WaitOne(3000);

            Receive(socks[i]);
            receiveDone.WaitOne(3000);
            i++;
}


Вот остальные функции (как в МСДН):

Код

    public class StateObject
    {
    public Socket workSocket = null;
    public const int BufferSize = 256;
    public byte[] buffer = new byte[BufferSize];
    public StringBuilder sb = new StringBuilder();
    }

    private static ManualResetEvent connectDone =
        new ManualResetEvent(false);
    private static ManualResetEvent sendDone =
        new ManualResetEvent(false);
    private static ManualResetEvent receiveDone =
        new ManualResetEvent(false);

    private static void ConnectCallback(IAsyncResult ar)
    {
        try
        {
            Socket client = (Socket)ar.AsyncState;
            client.EndConnect(ar);
            connectDone.Set();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private static void Receive(Socket client)
    {
        try
        {
            receiveDone.Reset();
            Console.WriteLine("Receive");
            StateObject state = new StateObject();
            state.workSocket = client;
            client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReceiveCallback), state);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private static void ReceiveCallback(IAsyncResult ar)
    {
        try
        {
            Console.WriteLine("ReceiveCallback");
            StateObject state = (StateObject)ar.AsyncState;
            Socket client = state.workSocket;

            int bytesRead = client.EndReceive(ar);
            if (bytesRead > 0)
            {
                state.sb.Append(Encoding.ASCII.GetString(state.buf  fer, 0, bytesRead));
                client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReceiveCallback), state);
            }
            else
            {
                if (state.sb.Length > 1)
                    response = state.sb.ToString();
                receiveDone.Set();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private static void Send(Socket client, String data)
    {
        sendDone.Reset();
        Console.WriteLine("Send");
        byte[] byteData = Encoding.ASCII.GetBytes(data);
        client.BeginSend(byteData, 0, byteData.Length, 0,
            new AsyncCallback(SendCallback), client);
    }

    private static void SendCallback(IAsyncResult ar)
    {
        try
        {
            Console.WriteLine("SendCallback");
            Socket client = (Socket)ar.AsyncState;
            client.EndSend(ar);
            sendDone.Set();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }


Первый прогон цикла проходит успешно (10 итераций). На второй заход он перестает получать ответ, а штампует ответ сокета №1 (socks[0]), примерно вывод такой:
>response 1
>response 2
...
>response 10
>response 10
>response 10
... (10 раз)

и на 21й:
Error: An established connection was aborted by the software in your host machine

В чем может быть проблема? Как вообще правильно использовать один и тот же асинхр. сокет для передачи-получения в цикле, не закрывая его?
PM MAIL   Вверх
userdab
Дата 22.9.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 3.9.2010

Репутация: нет
Всего: нет



Почитайте статью, может поможет чем

Еще 
Цитата(Svyatoslav Pankratov)
Автор: Эндрю Кровчик, Винод Кумар,  Номан Лаггари, и др.
Название: .NET Сетевое программирование для профессионалов
в главе 4 описываются асинхронные сокеты
 (источник)

Это сообщение отредактировал(а) userdab - 22.9.2010, 15:35
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0647 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.