Асинхронная работа с сокетами
От: ilya39  
Дата: 24.05.06 13:02
Оценка:
По пытался написать асинхронно работающий на сокетах сервер. Код в основном взял из: https://www.microsoft.com/Rus/Msdn/Magazine/2005/08/Winsock.mspx раздел "Асинхронный ввод-вывод"(впрочем практически аналогичное у меня получилось до чтения этого материала, после изучения help-а).

Столкнулся со следующей проблемой.

В методах AcceptCallback, ReceiveCallback, которые вызываются по завершении асинхронных операций BeginAccept и BeginReceive соответственно, используются сокеты так или иначе полученые IAsyncResult.AsyncState.

При закрытии сокетов (Socket.Close) (серверного сокета и сокетов созданных при получении входящего соединения от клиентов) методы AcceptCallback, ReceiveCallback вызываются, но сокет полученный из IAsyncResult.AsyncState уже закрыт, соответственно получаю исключение System.ObjectDisposedException: Cannot access a disposed object.

Конечно можно обойти эту проблему, использовать какой либо доп. флаг и т.д. и т.п.

Но хотелось бы узнать может есть какое-либо более оригинальное решение или подход...
Re: Асинхронная работа с сокетами
От: Александер Малафеев Россия http://www.meet-tech.com
Дата: 24.05.06 14:58
Оценка:
Здравствуйте, ilya39, Вы писали:

I>По пытался написать асинхронно работающий на сокетах сервер. Код в основном взял из: https://www.microsoft.com/Rus/Msdn/Magazine/2005/08/Winsock.mspx раздел "Асинхронный ввод-вывод"(впрочем практически аналогичное у меня получилось до чтения этого материала, после изучения help-а).


I>Столкнулся со следующей проблемой.


I>В методах AcceptCallback, ReceiveCallback, которые вызываются по завершении асинхронных операций BeginAccept и BeginReceive соответственно, используются сокеты так или иначе полученые IAsyncResult.AsyncState.


I>При закрытии сокетов (Socket.Close) (серверного сокета и сокетов созданных при получении входящего соединения от клиентов) методы AcceptCallback, ReceiveCallback вызываются, но сокет полученный из IAsyncResult.AsyncState уже закрыт, соответственно получаю исключение System.ObjectDisposedException: Cannot access a disposed object.


I>Конечно можно обойти эту проблему, использовать какой либо доп. флаг и т.д. и т.п.


I>Но хотелось бы узнать может есть какое-либо более оригинальное решение или подход...


Перед socket.Close нужно вызывать socket.Shotdown — чтобы запретить отправку/получение данных.
Асинхронная работа с сокетами
От: Аноним  
Дата: 24.05.06 13:19
Оценка:
Написал два сервера на сокетах! подобное было обходился флажками!
Врядли чтото другое есть если найдёш расскажеш!
Sonik


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.