eXeL@B —› Программирование —› Рушится при Recv в нете но не локалке |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 25 апреля 2007 22:05 · Поправил: mak · Личное сообщение · #1 Есть код описанны ниже, это код клиента ....сервер шлет много данных которые потом раскладываются по листвью .... каждые 1024 это название + 4 параметра разделеные символами ...и которые после получения расфасовываются по буферам для вставки ..... если поставить перед ресивом месадж бокс ....то будет много месаг ....тоесть есть многопотоковость ....я как то об этом раньше не думал .... получается если данные шлются на локалке ...это код принимает и все ок .....но если в нете ...то тогда клиент рушится ... с ошибкой в области этого кода .....теперь вопрос ......что делать ....как сделать очередь чтоб все по очереди проходили ..или клиент рушится из за ошибки в этом коде ??? Я так подумал что все потоки с одним буфером работают (с одними точнее) и из за этого все рушится ..вот ..Пасиб заранее
вставка в листвью..но тут вроде сто раз проверено все ок listV PROC
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 09 мая 2007 12:28 · Личное сообщение · #2 s0larian пишет: mak, ну это уже клиника просто.... мы же с Halt-ом тебе уже всё расписали и разложили. Ну да ...на примере проще ...но нигде примеров не нашел ....а проблема вот моя Это нужно учитывать. В неблокирующих сокетах отправку делать несколько сложнее, дело в том, что, если буфер отправки занят, то функция вернет нам ошибку WSAEWOULDBLOCK, поэтому придется ловить момент, когда этот самый буфер освободиться. Для этого подождем события FD_WRITE (способы ожидания событий описаны выше) и попытаемся отправить данные снова. Замечу, что события FD_WRITE может и не быть вовсе (конечно оно есть всегда - появляется один раз, сразу после установки соединения), если ты не попытаешься отправить большой объем данных. Поэтому вызывай сначала send, а затем, если произошла ошибка, жди FD_WRITE и в обработчике события отправляй данные. а у меня данные не приходят как раз из за того что сенд не посылает ,вот поэтому влияет слип,а то что вы сказали я сделал но говорюже что был бы пример я б всю картину видел ,я все равно своего добьюсь с клиникой или нет ))) у меня отдельная процедура шлет данные как моно сделать чтоб она останавливалась ...а по фд врайт слала опять ? ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 12 мая 2007 05:37 · Личное сообщение · #3 есть один нюанс. всегда при вызове функций работы с сокетами, нужно проверять результат на ошибку. в данном случае не возвращает ли случайно recv -1. Бывают случаи, когда уведомление о доступности данных успешно приходит, а вызов функции на получение возвращает ошибку, у меня у самого из-за этого программа падала когда компьютер выходил из спящего режима. Второе - всегда используй только безопасные функции работы со строками. Например, StringCchPrintf вместо sprintf и тому подобные. Это немного увеличит код на пару килобайт, но зато исключит возможность переполнения буфера и вообще выхода за его пределы. насчтёт send. флудить с отправкой данных нет никакой необходимости, у меня send вызывается в единственном случае - когда нужно отправить данные и есть такая возможность. для этого сделай вот что: заведи переменную bCanWrite, изначально присвой FALSE. когда получаешь FD_WRITE, то присвой bCanWrite = TRUE;а когда нужно отправить данные, то помещай их в очередь - двусторонний буфер, скажем так, и вышли через send содержимое очереди, если bCanWrite не ноль. после отправки bCanWrite = FALSE. затем объём, реально отправленный send'ом удали из очереди, и жди следующего FD_WRITE, а при получении проверяй есть ли данные в очереди. |
|
Создано: 12 мая 2007 12:46 · Личное сообщение · #4 X-BEOWOLF пишет: насчтёт send. флудить с отправкой данных нет никакой необходимости, у меня send вызывается в единственном случае - когда нужно отправить данные и есть такая возможность. для этого сделай вот что: заведи переменную bCanWrite, изначально присвой FALSE. когда получаешь FD_WRITE, то присвой bCanWrite = TRUE;а когда нужно отправить данные, то помещай их в очередь - двусторонний буфер, скажем так, и вышли через send содержимое очереди, если bCanWrite не ноль. после отправки bCanWrite = FALSE. затем объём, реально отправленный send'ом удали из очереди, и жди следующего FD_WRITE, а при получении проверяй есть ли данные в очереди. Да в точку,именно так я и сделал !!! А вот теперь уже !!! господа советчики появились все ваши ранее закоментированые ситуации!!! X-BEOWOLF Спасибо ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 12 мая 2007 18:35 · Личное сообщение · #5 |
|
Создано: 15 мая 2007 01:52 · Поправил: s0larian · Личное сообщение · #6 |
|
Создано: 15 мая 2007 18:30 · Личное сообщение · #7 |
|
Создано: 15 мая 2007 19:59 · Поправил: s0larian · Личное сообщение · #8 mak, у меня несколько проектов с blocking sockets, причём код компилеццо на и на виндузах и на линуксе. Причём проекты оттестированые и находятся "в производстве" Совет тебе (в последний раз ;) пиши на С простой клиент и сервер, разбирайся. Просто иначе ты будешь мучатся со своим глючным АСМ кодом вместо того что б вникать в принципы сетевого програмизма... |
|
Создано: 16 мая 2007 12:18 · Личное сообщение · #9 |
|
Создано: 16 мая 2007 19:57 · Поправил: s0larian · Личное сообщение · #10 mak, у тебя что, патологическая лень искать? http_://sage.mc.yu.edu/kbeen/teaching/networking/resources/sockets.htm Инсталишь cygwin, скачиваешь tcp-server.cc и tcp-client.cc и пишешь:
всё компилеццо, всё работает. Код простой, его мало, куча коментов. Конечно отсутствует поддержка нескольких паралельных клиентов, но дело не в этом Ну а инфы по теме, хоть жёппой кюшай: Google: socket client server tutorial http://www.google.com/search?hl=en&safe=off&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&hs=78g&q=socket+client+server+tutorial&btnG=Search Google: socket client server tutorial winsock http://www.google.com/search?hl=en&safe=off&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&q=socket+client+server+tutorial+winsock&btnG=Search |
<< . 1 . 2 . |
eXeL@B —› Программирование —› Рушится при Recv в нете но не локалке |