Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› Рушится при Recv в нете но не локалке
<< . 1 . 2 .
Посл.ответ Сообщение


Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 25 апреля 2007 22:05 · Поправил: mak
· Личное сообщение · #1

Есть код описанны ниже, это код клиента ....сервер шлет много данных которые потом раскладываются по листвью .... каждые 1024 это название + 4 параметра разделеные символами ...и которые после получения расфасовываются по буферам для вставки ..... если поставить перед ресивом месадж бокс ....то будет много месаг ....тоесть есть многопотоковость ....я как то об этом раньше не думал .... получается если данные шлются на локалке ...это код принимает и все ок .....но если в нете ...то тогда клиент рушится ... с ошибкой в области этого кода .....теперь вопрос ......что делать ....как сделать очередь чтоб все по очереди проходили ..или клиент рушится из за ошибки в этом коде ??? Я так подумал что все потоки с одним буфером работают (с одними точнее) и из за этого все рушится ..вот ..Пасиб заранее


.ELSEIF ax == FD_READ
invoke recv,sock,addr COMANDAIN,1024,0;sizeof COMANDAIN,0

invoke lstrlen ,addr COMANDAIN
mov ecx,eax
lea esi,offset [COMANDAIN]
lea edi,offset [PARAM1IN]
cld
XY: cmp byte ptr [esi],"]"
jz DALEE
movs byte ptr es:[edi],ds:[esi]
jmp XX
DALEE:
cmp byte ptr [esi+1],"["
jz DALEE2
movs byte ptr es:[edi],ds:[esi]
XX:
loop XY
jmp FIRST
DALEE2:

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
inc esi
inc esi
dec ecx
dec ecx
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
lea edi,offset [PARAM2IN]
cld
XYY: cmp byte ptr [esi],"]"
jz DAALEE
movs byte ptr es:[edi],ds:[esi]
jmp XXX
DAALEE:
cmp byte ptr [esi+1],"["
jz DALEE3
movs byte ptr es:[edi],ds:[esi]
XXX:
loop XYY
jmp FIRST
DALEE3:
; invoke SendMessage,hPROGRESS,PBM_STEPIT,0,0
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
inc esi
inc esi
dec ecx
dec ecx
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
lea edi,offset [PARAM3IN]
cld
XYYY: cmp byte ptr [esi],"]"
jz DAALEEE
movs byte ptr es:[edi],ds:[esi]
jmp XXXX
DAALEEE:
cmp byte ptr [esi+1],"["
jz DALEE4
movs byte ptr es:[edi],ds:[esi]
XXXX:
loop XYYY
jmp FIRST
DALEE4:

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
inc esi
inc esi
dec ecx
dec ecx
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
lea edi,offset [PARAM4IN]
cld
XYYYYY: cmp byte ptr [esi],"]"
jz DAALEEEE
movs byte ptr es:[edi],ds:[esi]
jmp XXXXX
DAALEEEE:
cmp byte ptr [esi+1],"["
jz DALEE5
movs byte ptr es:[edi],ds:[esi]
XXXXX:
loop XYYYYY
jmp FIRST
DALEE5:

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
inc esi
inc esi
dec ecx
dec ecx
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
lea edi,offset [PARAM5IN]
cld
X5: cmp byte ptr [esi],"]"
jz DAALE51
movs byte ptr es:[edi],ds:[esi]
jmp XXXXXY
DAALE51:
cmp byte ptr [esi+1],"["
jz FIRST
movs byte ptr es:[edi],ds:[esi]
XXXXXY:
loop X5
;####################################################
FIRST:


вставка в листвью..но тут вроде сто раз проверено все ок
listV PROC
invoke WIPECLEAR,addr COMANDAIN;call COMANDASCLEAR
mov lvi.imask,LVIF_TEXT
mov lvi.iItem,0
mov lvi.iSubItem,0
mov lvi.pszText,offset PARAM2IN
invoke SendMessage,hList, LVM_INSERTITEM,0, addr lvi
mov lvi.pszText, offset PARAM2IN
INVOKE SendMessage, hList, LVM_SETITEM, 0, addr lvi
;///////////////////////////////////////////////////
mov lvi.imask,LVIF_TEXT
mov lvi.iItem,0
mov lvi.iSubItem,1
mov lvi.pszText,offset PARAM3IN
INVOKE SendMessage, hList, LVM_SETITEM, 0, addr lvi
;/////////////////////////////////////////////////////
;///////////////////////////////////////////////////
mov lvi.imask,LVIF_TEXT
mov lvi.iItem,0
mov lvi.iSubItem,2
mov lvi.pszText,offset PARAM4IN
INVOKE SendMessage, hList, LVM_SETITEM, 0, addr lvi
;///////////////////////////////////////////////////
mov lvi.imask,LVIF_TEXT
mov lvi.iItem,0
mov lvi.iSubItem,3
mov lvi.pszText,offset PARAM5IN
INVOKE SendMessage, hList, LVM_SETITEM, 0, addr lvi
invoke WIPECLEAR,addr PARAM1IN
invoke WIPECLEAR,addr PARAM2IN ;call CLEAR2
invoke WIPECLEAR,addr PARAM3IN;call CLEAR3
invoke WIPECLEAR,addr PARAM4IN
invoke WIPECLEAR,addr PARAM5IN;call CLEAR4
ret
listV ENDP


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 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




Ранг: 7.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 мая 2007 05:37
· Личное сообщение · #3

есть один нюанс. всегда при вызове функций работы с сокетами, нужно проверять результат на ошибку. в данном случае не возвращает ли случайно recv -1. Бывают случаи, когда уведомление о доступности данных успешно приходит, а вызов функции на получение возвращает ошибку, у меня у самого из-за этого программа падала когда компьютер выходил из спящего режима. Второе - всегда используй только безопасные функции работы со строками. Например, StringCchPrintf вместо sprintf и тому подобные. Это немного увеличит код на пару килобайт, но зато исключит возможность переполнения буфера и вообще выхода за его пределы.

насчтёт send. флудить с отправкой данных нет никакой необходимости, у меня send вызывается в единственном случае - когда нужно отправить данные и есть такая возможность. для этого сделай вот что: заведи переменную bCanWrite, изначально присвой FALSE. когда получаешь FD_WRITE, то присвой bCanWrite = TRUE;а когда нужно отправить данные, то помещай их в очередь - двусторонний буфер, скажем так, и вышли через send содержимое очереди, если bCanWrite не ноль. после отправки bCanWrite = FALSE. затем объём, реально отправленный send'ом удали из очереди, и жди следующего FD_WRITE, а при получении проверяй есть ли данные в очереди.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 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





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 12 мая 2007 18:35
· Личное сообщение · #5

И все таки прошу пример на АСМЕ , ПОЖАЛУСТА !!!! (сообщения типо гугль в помощь не писать)

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 мая 2007 01:52 · Поправил: s0larian
· Личное сообщение · #6

mak, кста, я бы не заморачивался и использовал blocking sockets. select() скажет тебе когда есть данные в сокете, а recv() сколько данных ты получил в буфер.

Примеров, кста, в нете море - но они на С/С++.

Посторюсь, напиши сначала на С.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 15 мая 2007 18:30
· Личное сообщение · #7

Ti pisal Blokiruesie? prosto vesde pisut ,sto esli sto to ne doydet! To gopa, vse prilogenie ruhnet ))) eto tak ? A c++ ya ne nau, tolko nachal ego poduchivat

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 мая 2007 19:59 · Поправил: s0larian
· Личное сообщение · #8

mak, у меня несколько проектов с blocking sockets, причём код компилеццо на и на виндузах и на линуксе. Причём проекты оттестированые и находятся "в производстве"

Совет тебе (в последний раз ;) пиши на С простой клиент и сервер, разбирайся. Просто иначе ты будешь мучатся со своим глючным АСМ кодом вместо того что б вникать в принципы сетевого програмизма...




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 16 мая 2007 12:18
· Личное сообщение · #9

Ok ...uchitivaza sto C plus ne nau , posovetuz chenit na C to sto podozdet, soberu na c ... i ida v pomosh iyuchat kod

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 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 и пишешь:

make tcp-server
make tcp-client


всё компилеццо, всё работает. Код простой, его мало, куча коментов. Конечно отсутствует поддержка нескольких паралельных клиентов, но дело не в этом

Ну а инфы по теме, хоть жёппой кюшай:
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 в нете но не локалке
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати