Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Реализую клиет сервер на основе функций из winsock2.h Долго не мог понять в чем проблема но получается что если сразу сделать две отправки от клиента к серверу или наоборот что то типо Код: plaintext 1. 2. то сообщение как бы объединяется в одно, иногда все ок получается два отдельных сообщения, но иногда так иногда не так это конечно проблема. Как можно однозначно разделить сообщения на разные ? Есть какие то средства в winsock2 или единственный путь придумывать какой то свой разделитель? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 12:32 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom, Это стандартное поведение TCP сокетов. TCP это транспорт который доставляет поток байтов. Он не разделяет этот поток на сообщения. Вам надо на уровне приложения уметь различать разные сообщения. Например перед каждым сообщением записывать в сокет его длину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 12:36 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, А можно пример на с++, как записывать и считывать ? Длинна же может быть из одной цифры, а может из трех итд Какое то стандартное решение для этого наверняка уже есть, не хотелось бы сочинять свои велосипеды в такой важной части кода как клиент сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 13:44 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromДлинна же может быть из одной цифры, а может из трех итд Раз у тебя протокол текстовый, то делай текстовый разделитель посылок. Обычно в таких случаях используется символ конца строки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 13:57 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromКакое то стандартное решение для этого наверняка уже есть, не хотелось бы сочинять свои велосипеды в такой важной части кода как клиент сервер. Почитай RFC по протоколам HTTP, SMTP, POP3. Там как раз описано стандартное решение. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 13:59 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom, примерно так (если без обработки ошибок) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. recv_all - это написанная вами функция, которая в цикле вызывает стандартную recv пока из сокета не будет прочитано ровно len байтов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 14:04 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Стандартный recv у меня уже в цикле while ждет сообщений Код: plaintext 1. 2. 3. То есть идея как я понял такая, преобразованная в строку переменная типа int имеет стандартную длину, сначала считываться значение int, а потом преобразуется из строки обратно в int и уже считывается само сообщение ? непойму если эта часть Код: plaintext 1. преобразует int в строку, то как из строки получить значение типо int ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 15:08 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Вернее даже так как из начала строки прочитать количество символов равным int len; sizeof(len); и преобразовать полученный результат в обычное число int. и прочитать часть строки от значения sizeof(len) до числа полученного из int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 15:12 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromСтандартный recv у меня уже в цикле while ждет сообщений Код: plaintext 1. 2. 3. Еще раз: recv не читает сообщения. Он читает поток байтов кусками случайной длины. Поэтому чтобы прочесть например int который является 4-мя байтами, вам нужно вызывать в цикле recv пока не будут прочитаны ровно 4 байта. Не больше не меньше. Поэтому ваш цикл с recv не годится. Как я выше сказал, напишите функцию recv_all и используйте ее для чтения фиксированного кол-ва байтов. Например так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. tromнепойму если эта часть Код: plaintext 1. преобразует int в строку, то как из строки получить значение типо int ? Тут нет преобразования в строку. Тут бинарное представление int рассматривается как массив char. Такие базовые вещи С/С++ надо бы уже знать прежде чем писать сетевые программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 16:05 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromКакое то стандартное решение для этого наверняка уже есть, не хотелось бы сочинять свои велосипеды в такой важной части кода как клиент сервер. Почитай про ZMQ . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 19:21 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
топикстартеру: еще раз, есть два протокола основных передачи данных в TCP/IP: UDP и TCP. UDP пакетный, там есть пакеты и ты посылаешь и получаешь пакеты, но правда порядке пакетов не гарантирован и доставка тоже не обязательна. TCP - наоборот, потоковый. пакетов нет, но доставка гарантирована. потоковый - это как любой файл или поток ввода/вывода: читаешь байтик за байтиком, и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2013, 20:48 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom...Долго не мог понять в чем проблема но получается что если сразу сделать две отправки от клиента к серверу или наоборот....или единственный путь придумывать какой то свой разделитель? Офф/2: Поздравляю! Вы один из не многих, кто увидел грабли в листве. Многие присыпают листвой потолще, у кого-то широкий шаг(в смысле тестирования не увидели)... Тут всё верное прозвучало выше. TCP - потоковый. Ответ на Ваш вопрос становится очевиден, если представить как течёт поток воды и Вам надо отделять одну молекулу от другой. Но в сокетах немного попросче - Вы можете задавать строгую последовательность нескольких молекул(не встречающихся в основном потоке) - т.е. некий префикс вашему кванту. Либо заранее знать сколько Вы хотите получить на приёме. Для этого, обычно всегда передают заголовок(а на приёмной стороне он всегда гарантировано будет принят и он не делим) и из него знают длину хвоста идущего за ним. Ну или как тут уже прозвучало - поменять протокол. Но Это всё-же похоже не для Вашей задачи... удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 03:52 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Пример не рабочий. Сижу разбираюсь целый день, тут какая то сложная работа с указателями пока я даже логику понять не могу. А можно написать пример который будет работать ? то есть есть две отправки первая это длинна сообщения, вторая это само сообщение и получатель должен получив сначала длину корректно прочитать основное сообщение К примеру функция recv_all(SOCKET s, char* buf, int len) зависает при выполнении первый send вроде выводит но получает что то непонятное вроде знаков ====, а второй до конца обработать не может Что и как править я разобраться не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 14:29 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom, Придумывать и отлаживать код за вас лень. Давайте вы приведете ваш код, а мы скажем что поправить. А то иди знай что у вас не работает, может вы неправильные аргументы передаете. Телепаты в отпуске. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 16:03 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Ок тогда просто скину весь код клиент сервера с кодом из вашего примера Как понимаю нужно править только клиент и его способ получения данных в нем вся проблема, а если отладить получение на клиенте то просто вставить ту же функцию на сервер и все. Клиент Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. Сервер Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 16:52 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. Выводят мусор еще до попытки получения данных пакета. Какой смысл выводить что там в свежевыделенной памяти валяется? Особенно когда buff2 нигде не используется и не освобождается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 17:09 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
wst, делать то что? удалить их? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 17:17 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Вот это Код: plaintext 1. заменить на Код: plaintext 1. Кроме того, как выше сказали, это бессмысленный кусок кода, выводящий мусор. Код: plaintext 1. 2. Кроме того, если вы передаете длину сообщения, то это нужно делать везде, а не по желанию, в том числе и в серверной части. Кроме того, после комментария Код: plaintext 1. у вас только код принимающий данные, т.е. комментарий противоречит коду. Но это ладно. А вот, хоть сервер и пытается читать с клиента, но клиент ни разу ничего не отправляет. Как поправите эти очевидные баги, приводите очередной вариант кода, будем смотреть дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2013, 21:23 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Выше правильно уже прозвучали необходимые доработки... свои 5 копеек... trom ... Сервер Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. данная увязка потоков быдет плыть при ударных нагрузках на сервак. И в случаи аварийных остановов или быстрое внешняя попытка отгрузки программы в некоторых случаях будет приводить к очень интересным поведениям. Или по другому... Т.к. при вызове бегинсреад потоку ещё управление не передалось, и в случае короткого времени жизни приложения вообще не передастся, и Вам пофигу: начала работу ниточка или нет - предлагаю вообще нитку не запускать (в некоторых случая так оно и будет). и ышо... то что у вас и приветная и ответная части обе слушают - то ничего не будет(это уже прозвучало выше). Обратите внимание как слушает клиент. Что он ожидает (длину данных и тип), и что делает после этого. Ответная часть(в частности сервак) должен именно так(и такие размерности) и послать данные... удачи вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 02:42 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Код заменил теперь вроде ничего не зависает и передается, но я не могу понять как извлечь из Код: plaintext 1. значение длинны последующего сообщения ведь тут в функцию не передается массив char, тут у нас (char*)&len Код: plaintext 1. 2. А этот код работает но значение длинны сообщения 5 я поставил сам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 08:40 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
kolobok0, Не понял предлагаете не использовать _beginthreadex( и сделать просто последовательный сервер ? или я его как то не так использую ? В примере клиент сервера на котором я основывался была функция CreateThread про которую писали что лучше ее заменить на _beginthreadex (так как у меня просто консольное приложение), я и заменил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 08:43 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom Код: plaintext 1. Тут вы читаете из сокета int в переменную len и тут же затираете его, присваивая возвращаемое значение recv_all (сколько байтов прочитано) в ту же переменную len. Используйте разные переменные для этих двух длин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 09:01 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromтут в функцию не передается массив char Несмотря на то, что параметр функции объявлен как char*, функция работает с любым указателем, поскольку ей не нужно интерпретировать массив байт. Если хотите, можете полезть в заголовочные файлы и заменить тип этого параметра на void*. Может, тогда в Вашем мозгу что-нибудь прояснится. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 14:17 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Все наконец заработало спасибо! только я непойму а как сделать цикл типа while который ждал бы сообщений в бесконечном цикле то есть нужно что то типо Код: plaintext 1. 2. Но с использованием вашей функции recv_all ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 14:31 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom, nclients--; // уменьшаем счетчик активных клиентов У тебя доступ к этой переменной из разных потоков без синхронизации. Будут гонки ( rase conditions ). Тебе надо защищать доступ к этой переменной мьютексом или критической секцией. Конкретно здесь лучше всего заменить изменение переменной на InterlockedIncrement/Decriment msdn.microsoft.com/en-us/library/windows/desktop/ms683614(v=vs.85).aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 15:28 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom, по переменной client_socket у тебя тоже будут гонки. Она также незащищена ничем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 15:52 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom, Ты так же везде шлёшь бинарку, т.е. у тебя нифига не текстовый протокол, но буфера все печатаешь как симпольные, printf-ом. Плохо кончится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 15:59 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Ну и вообще дофига других ошибок дурацких. Любая из них может привести всё в неработоспособное состояние. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 16:16 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
MasterZiv, переменную nclients--; // уменьшаем счетчик активных клиентов можно и удалить, она не очень важна printf тоже только в режиме отладки нужен А вот client_socket важна, с много поточностью почти не работал, можно пример в коде что с ней можно сделать чтобы не было проблем ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 16:53 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromчто с ней можно сделать чтобы не было проблем ? Передавать её в поток по значению, а не по ссылке. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 17:31 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovtromчто с ней можно сделать чтобы не было проблем ? Передавать её в поток по значению, а не по ссылке. +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2013, 17:49 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Как именно передать ее по значению? Код: plaintext 1. компилируется Код: plaintext 1. уже нет то есть client_socket можно передать только по ссылке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 02:00 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromMasterZiv, Как именно передать ее по значению? Код: plaintext 1. компилируется Код: plaintext 1. уже нет то есть client_socket можно передать только по ссылке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 12:16 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromКак именно передать ее по значению? RTFM typecast Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 13:38 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovtromКак именно передать ее по значению? RTFM typecast дам подсказку : этот параметр потока на самом деле не указатель, а просто машинное слово. ос его не отрабатывает, а в неизменном виде передает функции потока. главное, чтобы твои данные туда влезли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 14:09 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Лучше в коде покажи как сделать, подсказка мне не помогла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 15:46 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom, _beginthreadex(NULL,NULL,SexToClient,(void *)client_socket,NULL,&thID ); и на приемной стороне аналогичное преобразование в обратную сторону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2013, 20:40 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Код: plaintext 1. вот так скомпилилось. Но при запуске клиент сервера, сервер зависает. На приемной стороне это где ? внутри функции ? Что делать то, можно пример как преобразовать в обратную сторону? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 09:01 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromMasterZiv, Код: plaintext 1. вот так скомпилилось. Но при запуске клиент сервера, сервер зависает. На приемной стороне это где ? внутри функции ? Что делать то, можно пример как преобразовать в обратную сторону? да, внутри функции потока. обратное преобразование socket = (int) thread_param; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 11:26 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
навараксал это всё по-нормальному... получился такой полноценный Winsock-echo-server... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 15:06 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Спасибо теперь понятно! Чуть попозже выложу свой код клиент сервера попроще. Причесываю код, разделяю все на функции и возникли вопросы: 1) Нужно ли выделять разные порты если на компе будут работать две и больше программы сервера ? Если нужно получается нужна отдельная прога на сервере, типо главный сервер который будет иметь порт известный всем клиентам и она будет распределять подключения от клиентов сообщая порт свободной программы сервера. 2) Как лучше сделать: а) Клиент отправляет сообщение получает ответ и отсоеденяется . б) Клиент постоянно подключен к серверу, все время работы программы клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 20:28 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
MasterZivнавараксалчто сделал? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 21:09 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
1) Нужно ли выделять разные порты если на компе будут работать две и больше программы сервера ? как бы на одном порту они просто не смогут работать. 2) Как лучше сделать: а) Клиент отправляет сообщение получает ответ и отсоеденяется . б) Клиент постоянно подключен к серверу, все время работы программы клиента. б) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2013, 23:01 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Вынес подключение клиента к серверу в отдельную функцию и возник вопрос. Для того чтобы клиент был подключен к серверу от начала запуска проги и до конца, если правильно понимаю переменную Код: plaintext 1. нужно делать глобальной. А как проверить что этой переменной уже присвоено какое то подключение к серверу ? Чтобы сделать проверку о наличии подключения и если его нет или оно разорвано пере подключится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 19:10 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Для того чтобы клиент был подключен к серверу от начала запуска проги и до конца, если правильно понимаю переменную Код: plaintext 1. нужно делать глобальной. Нет, ты понимаешь неправильно. А как проверить что этой переменной уже присвоено какое то подключение к серверу ? Чтобы сделать проверку о наличии подключения и если его нет или оно разорвано пере подключится. Сравнить её с "НУЛЁМ". Что для переменной SOCKET является нулём -- ещё вопрос, но я думаю, что если ты затрёшь её всю нулями, а после установки соединения проверишь, что там не всё нули, будет оно самое то. Другой вариант -- переменную сделать указателем, проверять на NULL и выделять при установке соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 20:11 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Есть тут только одна маленькая фигня: разрыв соединения (по любой причине) не приводит к автоматическому обнулению переменной на что надеется ТС. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 20:22 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromMasterZiv, Вынес подключение клиента к серверу в отдельную функцию и возник вопрос. Для того чтобы клиент был подключен к серверу от начала запуска проги и до конца, если правильно понимаю переменную Код: plaintext 1. нужно делать глобальной.Неправильно. Глобальность переменной для этого будет полезна, но она не гарантирует того что коннект будет существовать. tromА как проверить что этой переменной уже присвоено какое то подключение к серверу ?Функция socket() возвращает -1 если она не смогла создать сокет. Поэтому обычно и переменную держат в этом значении чтобы показать что сокет не существует. Но это просто рекомендация. В 0 ее ставить для несуществующего сокета не стоит - ноль это обычно stdout. Вполне существующий поток. tromЧтобы сделать проверку о наличии подключения и если его нет или оно разорвано пере подключится.Проверяй результат который тебе возвращают все твои send()/recv(). Если они упали с ошибкой - читай номер ошибки. И если это ошибка отсутствия коннекта - подключайся заново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 21:12 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
White OwlФункция socket() возвращает -1 Под виндой тип SOCKET - unsigned. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 21:23 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite OwlФункция socket() возвращает -1 Под виндой тип SOCKET - unsigned.Под виндой socket и WSASocket возвращают INVALID_SOCKET. Хочешь угадать чему оно равняется? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 21:29 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
White Owl, В доке прямо написано, что не следует предполагать что INVALID_SOCKET приводится к -1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 21:31 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite Owl, В доке прямо написано, что не следует предполагать что INVALID_SOCKET приводится к -1.Где это написано? Ткни пальцем пожалуйста. А в winsock2.h есть строчка: #define INVALID_SOCKET (SOCKET)(~0) Так чта... Оно конечно не -1 с точки зрения компилятора, но... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 21:37 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
White OwlГде это написано? Ткни пальцем пожалуйста. http://msdn.microsoft.com/en-us/library/windows/desktop/ms740516(v=vs.85).aspx авторchecking for errors when the socket and accept functions return should not be done by comparing the return value with –1, or seeing if the value is negative (both common and legal approaches in UNIX). Instead, an application should use the manifest constant INVALID_SOCKET White OwlА в winsock2.h есть строчка Полагаться надо на АПИ, а не на детали реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 21:53 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
White Owl, Anatoly Moskovsky, MasterZiv, Сейчас у себя потестил когда клиент подключается на не реальный ип адрес Функция WSAGetLastError(); возвращает ошибку с кодом 10093 как при отправке так и при получении данных То есть наметил такую схему программы После первого подключения клиент при каждой отправке или получении данных ждет ошибку от WSAGetLastError(); с кодом 10093 и если ее получает то пытается подключиться по новой. Все правильно или опять что не так понял ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 22:01 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Только не так. Соединяться можно и по-прежнему, а вот дальше считать любую ошибку от recv() поводом пересоздать соединение. И еще очень облегчит жизнь вынос приема-отправки сообщений в отдельную пару функций, которые сначала отладить на кошках, потом уже на их основе делать что клиента что сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 22:24 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Начнем с того что ошибка 10093 никакого отношения к ИП адресам или ошибкам подключения не имеет. Это WSANOTINITIALISED, что означает либо еще не вызван WSAStartup либо уже вызван WSACleanup, то есть сугубо криво написанная программа :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2013, 23:21 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
Все сделал клиент с обработкой ошибок, покритикуйте! Все разделено на отдельные функции чтобы было удобно применять в больших проектах, где всякие детали подключения и отправки только будут мешать. В процессе работы сервер может пропадать и появляться в любое время, прога при пропаже сервака сразу начинает отсчет попыток подключиться, если сервер успевает появиться работает опять в нормальном режиме если нет завершает работу с ошибкой. Ошибки обрабатываются при каждой отправке или получении данных и при первом подключении к серверу. Можно задать максимальное количество попыток подключиться и паузу между попытками. Ошибки обрабатываются просто, если она есть происходит пере подключение, хотя конечно они могут быть из за разных причин, но только эту можно обработать в программе, все остальное ошибки программиста. Сначала хотел обрабатывать только ошибку 10054, но потом подумал пусть лучше при любой ошибки переподключается. сервер выложу позже, как понимаю будет попроще, ошибки там обрабатывать не надо, сложности только в нюансах работы с много поточностью. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2013, 19:52 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
trom, Вот это вот if (WSAStartup(0x202, (WSADATA *)&buff[0])) что за порнография, а? расскажи пожалуйста... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2013, 21:17 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
MasterZiv, да спасибо! Я еще сам думал зачем при подключении массив char buff, заменил на кусок из твоего кода Код: plaintext 1. 2. 3. 4. 5. 6. 7. А так в целом все ок по коду ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2013, 23:42 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
MasterZiv, кстати эту buff автор кода объясняет так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. то есть какая то экономия переменной, но при выносе подключения в отдельную функцию экономии никакой нет. Да и что вообще за экономия переменной ? первый раз такое слышу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2013, 23:48 |
|
||
|
Как разделить сообщения на клиент сервере
|
|||
|---|---|---|---|
|
#18+
tromто есть какая то экономия переменной, но при выносе подключения в отдельную функцию экономии никакой нет. Да и что вообще за экономия переменной ? первый раз такое слышуИзвращение это. Совершенно не нужное и более того - вредное. Один из источников вредности ты только что увидел: буфер должен быть не менее полкилобайта размером. А если тебе буфер нужен меньшего размера, и ты его уменьшишь не заметив комментария в тексте - получишь либо GPF, либо плавающие ошибки в совершенно разных местах программы, которые будешь долго искать. Ну и в именах переменных будешь путаться. В принципе, если ты сидишь на машине с очень маленькой памятью, то это может быть полезным. Этакое "управляемое повторное использование ячеек памяти". Но в реальности такое нужно только на ОЧЕНЬ маленькой памяти. Я таким развлекался последний раз на МК-61, были такие программируемые калькуляторы с 15-ю ячейками памяти. Но уже на Специалисте, имевшем целых 48Кб ОЗУ и на ассемблере (где памятью управлять напрямую можно) осознал что такая экономия памяти может вылезти боком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2013, 01:24 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019787]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
107ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 225ms |

| 0 / 0 |
