2013-12-12 1 views
0

Я в основном реализовал this asynchronous server socket example (и соответствующий клиент). Используя его, я могу ответить клиенту, если я точно следую примеру, т. Е. Если вызов Send() ответ находится в методе ReadCallback().Как я могу ответить асинхронно клиенту с помощью сокетов в C#?

Если, однако, я пытаюсь отправить ответ за пределы здесь, то есть в обратном вызове, который я подключил к моей процедуре обработки сообщений (работает в другом потоке), я получаю ошибку this, заявив, что Socket Не подключен. Если я попытаюсь отправить ответ в другом месте в коде Server, скажем, в цикле while(true), который прослушивает входящие соединения, я получаю ту же ошибку.

Я пропустил что-то фундаментальное здесь?

Edit:

Хорошо, так что я прочитал Two-way communication in socket programming using C, и теперь я думаю, в соответствии с этим ответом, что я должен изменить пример, который я связан с тем чтобы я ответить на сервер на socket, возвращенный процессом accept. Моя цель - позвонить Send() за пределами получаемого обратного вызова, скажем от Main(), после подключения клиента и сервера.

Возможно, кто-нибудь предложит мне изменить пример для достижения того, чего я хочу? Я полностью запутался в этом и не хочу создавать отдельный поток, если мне это не нужно (что, согласно моему вопросу, мне не нужно ...).

+0

Проводка соответствующего фрагмента кода до/после внесения изменений поможет нам лучше понять. Разговор хорош, но, как правило, точно не описывает код. – Jon

ответ

1

Если вы хотите, чтобы соединение было открытым, необходимо было бы сохранить переменную handler, так как это соединение с открытым сокетом. Затем, когда вы хотите отправить это сообщение, вы получите его сокет и отправьте его.

Кроме того, вы, очевидно, не будете вызывать Shutdown() и Close() в переменной handler.

+0

Вы, сэр, абсолютный герой. Это самый простой способ, который я сделал за несколько недель. Это был определенно случай «не видел леса для деревьев»! (FYI, это была настойчивость, которую я отсутствовал). –