Winsock и безопасность потоков - PullRequest
0 голосов
/ 19 февраля 2012

Я некоторое время программировал на C ++, но я новичок в сетевом программировании, и мне неясно, в чем состоит пара вещей, так что это вопрос из трех частей.

  1. В примерах приложений я видел вызов send () для одного сокета, проверку его возвращаемого значения, а затем сразу же после вызова recv () для того же сокета. Однако я нахожу это странным, так как recv () не вызывается до тех пор, пока не отправлено send (), поэтому нет ли риска, что ответное сообщение поступит до вызова recv? Если это так, действительно ли это проблема или сообщение будет зависать в подвешенном состоянии до тех пор, пока не будет вызван recv, и оно не будет получено?

  2. Я хочу написать класс, который взаимодействует с сервером и может делать несколько различных запросов к серверу, с одной функцией для каждой, которая отправляет запрос, а затем ожидает ответа. Мой клиент будет иметь экземпляр этого класса в качестве члена. Учитывая, что send () и recv () блокируют вызовы, даже если я создаю отдельный поток для сетевых коммуникаций, как я могу остановить все сетевые коммуникации от остановки во время ожидания ответа на один запрос? Если произойдет сбой одного сообщения, пока не истечет время отправки / возврата, я не смогу сделать больше запросов, так что мне нужно более одного сокета для каждого клиента? Больше чем одна нить?

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

Извините, это было так долго. Спасибо.

1 Ответ

1 голос
/ 19 февраля 2012
  1. Механизм не такой простой.На стороне клиента, на стороне сервера или в обоих случаях могут быть задействованы буферы.Например, отправка на стороне клиента может считаться завершенной, когда сообщение было скопировано в буфер, а не когда оно фактически отправлено по сети.Точно так же сообщения будут скопированы в буфер на стороне сервера, так что отправка от клиента совпадает с получением на сервере.Не беспокойтесь об этом аспекте.

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

  3. См. Номер 2.

...