Есть у меня класс обёртка над сокетом
У него есть функция Connect
Там я перевожу сокет в не блокирующий режим
Делаю connect
Жду с помощью select
Если не дождался, кидаю Exception
Процедура завершается
Но я передавал в connect указатель на sockaddr_in
Он теперь стал недействительным
А сокет то всё ещё делает connect
Его нужно как-то остановить?
Или он скопировал себе структуру?
Вопрос_2
Как обстоит дело с recv?
Там то я передаю указатель на буфер данных
Вышел я из процедуры через Exception
А он данные получил и запишет их уже по не валидному адресу
Вопрос_3
Слава богу у recv есть встроенный timeout
Который я устанавливаю через setsockopt RCVTIMEO
Но когда я замеряю время через которое вернёт управление reсv
Всегда получается на 500мс больше
Ставлю 3000, получаю 3500
Ставлю 10000, получаю 10500
Что-то делаю не так?
Вопрос_4
Функции с префиксом WSA чем то лучше обычных?
Быстрее?
Или чисто интерфейс другой?
Здравствуйте, TailWind, Вы писали:
TW>Его нужно как-то остановить?
Нужно только закрыть более ненужный сокет.
TW>Или он скопировал себе структуру?
Системный вызов connect? Да, он уже всё ему нужное скопировал.
TW>Как обстоит дело с recv? TW>Там то я передаю указатель на буфер данных TW>Вышел я из процедуры через Exception TW>А он данные получил и запишет их уже по не валидному адресу
Выходишь ты из функции в момент вызова recv? Очевидно нет!
Функция recv не записывает данные в произвольный момент времени после окончания своей работы. При вызове она копирует уже принятые данные в переданный буфер — это действие выполняется только синхронно.