C # async socket чтение и запись одновременно?

В настоящее время я пишу сервер чата tcp, и я прочитал много статей о синхронных и асинхронных сокетах.

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

Во всех статьях было красиво объяснено, как установить соединение и как отправлять и получать данные, НО никогда не происходит того, что происходит, если может быть отправлено более одного сообщения без ответа.

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


person D4rth B4n3    schedule 18.09.2014    source источник
comment
Можно пример кода?   -  person Gusdor    schedule 18.09.2014
comment
У меня действительно нет кода, я все еще в процессе планирования. Это общий вопрос.   -  person D4rth B4n3    schedule 18.09.2014
comment
Технико-экономическое обоснование - важная часть выбора технологии. т.е. Выберите технологию и попробуйте. Если это не удается, и вы не знаете почему, мы хотели бы увидеть этот код.   -  person Gusdor    schedule 18.09.2014
comment
Нет причин менять это мнение. Сокеты будут асинхронными независимо от того, что вы делаете; если вы используете асинхронный API, вы не будете перегружать систему потоками, сидящими без дела в ожидании связи, и, следовательно, будете более масштабируемыми.   -  person Peter Ritchie    schedule 18.09.2014


Ответы (2)


Найдите там пример асинхронного прослушивателя TCP и клиента https://github.com/vtortola/AynchronousTCPListener.

Вы можете отправлять и писать, и в то же время вы не можете отправлять из двух потоков одновременно через один и тот же сокет.

person vtortola    schedule 18.09.2014

По моему опыту, это не проблема для Socket.Send или Socket.SendAsync

person jeoffman    schedule 18.09.2014
comment
Я написал модули, которые отправляют данные через сокеты TCP через несколько потоков. С Socket.Send это тривиально, а с SendAsync вам просто нужно управлять своими буферами потокобезопасным способом. - person jeoffman; 19.09.2014