|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
18.10.2012, 21:56 | #1 | ||
Пользователь
Регистрация: 04.10.2012
Сообщений: 95
|
Правильно закрыть WinAPI Socket
Не вопрос, а скорее утверждение, хотя если кто-то исправит, буду рад.
Цитата:
Цитата:
Пример кода из моего сервера: Код:
Пишу на чистом С, плюсы спилил.
|
||
18.10.2012, 22:18 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Возможно вам так же стои посмотреть в сторону функции linger()
|
19.10.2012, 14:09 | #3 | ||
Пользователь
Регистрация: 04.10.2012
Сообщений: 95
|
Спасибо за квест по структуре linger и функции setscokopt, за то точно разобрался и код расширился: (тут http://www.irietools.com/iriepascal/progref393.html все отлично описано, а именно перевожу нужную часть)
чтобы сокет закрылся "жестко" перед вызовом closesocket нужно выставить сокету опцию SO_LINGER структуры linger l_onoff в !=0 и l_linger в 0) Цитата:
Цитата:
Собственно код измененный: Код:
Возможно стоит сделать Sleep() перед закрытием чтобы все данные отправились, от куда мне знать что там из них queued. С другой стороны, попробовал без слипа несколько передач прошли на ура с точной передачей всех данных. Пока буду без Sleep(). Наверное при большой нагрузке "хвост" будет теряться, но с другой стороны "обрывание очередей" улучшит устойчивость к большим нагрузкам. P.S. Еще если все это проверить с достоверной статистикой можно писать научную работу по закрытию сокета =)
Пишу на чистом С, плюсы спилил.
|
||
19.10.2012, 15:25 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Я думаю надо делать shutdown(socket, SD_SEND) (а не как у вас recv), что пошлет на "ту сторону" сигнал, что больше данных нет, т.е. там будет recv 0, после чего та стороно закроет сокет, после чего ваш recv вернет 0, после чего я так понимаю можно закрывать сокет.
Может стоит также посмотреть в сторону асинхронного I/O а там есть хорошая функция DisconnectEx() |
19.10.2012, 17:22 | #5 | |
Пользователь
Регистрация: 04.10.2012
Сообщений: 95
|
shutdown(socket, SD_SEND)
у меня shutdown(_Client,2) т.е. SD_BOTH Код:
Цитата:
Пишу на чистом С, плюсы спилил.
Последний раз редактировалось LynXzp; 19.10.2012 в 17:25. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как правильно выделить буфер для приёма строки от WinApi функции | c0mp | Win Api | 14 | 03.08.2012 17:10 |
Различие кода mfc и WinApi(mfc ручками набили, а WinApi автоматически с генерировался!! нужно явное отличие, не могу найти) | Артём1991 | Помощь студентам | 0 | 25.03.2012 17:13 |
Не правильно (или правильно?) работает позиционирование в WebKit | mutabor | HTML и CSS | 5 | 09.12.2010 09:54 |
Работа с Socket-ом c помощю WinAPI | 69 region | Помощь студентам | 13 | 11.04.2008 17:22 |