Есть структура размером более 95кб. За раз - не получается ее отправить (10040 wsa error)! Как быть? Благодарен!
Да я определил структуру! Вот она: Код (Text): typedef _tag_rem_data{ byte cmd; char path[MAX_PATH]; char data[96*1024]; } rem_data; За один раз не получается отослать структуру (10040): Код (Text): rem_data data; sendto(s, data, sizeof(data), 0, sin, lsin); Подскажите плз как мне эту структуру разбить на части и посылать последовательно! С верверной стороны я сам все получу ок, знаю как! А тут загвоздка. Помогите плз.
rem_data data; int buflen = sizeof(data); char *bptr = (char*)&data; int n; #define len 1024 //размер передаваемого за раз куска while(true){ if(buflen >= len){ n = send(s,bptr,len,0); bptr += n; buflen -= n; } else{ send(s,bptr,buflen,0); break; } } Этот код мало пригоден для реального использования(проверки на ошибки напроч отсутсвуют), но сама идея должна быть понятна. З.Ы.: Писалось отбалды, поэтому работоспособность не гарантируется, а даже наоборот З.З.Ы.: С сишными вопросами лучше обрашайся на sources.ru, там кстати подобный вопрос всплывал нераз.
Я вот тут подумал, посовещался с мастерами и тут нарисовался такой вопрос: если даже я распилю структуру на части то как я их словлю? Ведь передача идет по UDP протоколу который НЕ гарантирует ни очередность, ни собсна факт доставки датаграммы! Как быть, господа?
ZeroMemory Предусмотри в каждой части место для номера части, общего количества частей и уникального идентификатора, на случай если потребуется из разных потоков посылать разные структуры порезанные на части.
Ведь передача идет по UDP протоколу который НЕ гарантирует ни очередность Извиняюсь, может я чего не понял (в сетях не разбираюсь), но если ты работаешь на уровне send/recv, то может быть так, что данные из первой посылки by send придут раньше, чем была вторая посылка ?! Разве ниже уровнем нет протокола, который уже следит за очередностью ? А если это не так, то можно смело посылать кусками безо всяких zmodem'ов или zontalk'ов
ZeroMemory Есть структура размером более 95кб udp - это datagram-oriented протокол. это означает, что ты получишь ровно столько, сколько отправил (пакет не режется на части). максимальный размер udp-пакета возвращается при вызове WSAStartup и на винде он равен ~64Kb. поэтому тебе надо организовать свой протокол, который будет резать твои буфера на размеры меньше 64K, снабжать их спец. заголовком и отправлять. на приемной стороне собираешь эти пакеты до кучи. tcp (в отличии от udp) это stream-oriented протокол, и вот там пакет может резаться как угодно, то есть теоретически ты может отправить 10 пакетов по 100 байт, а получить 1 пакет на 1000 байт. а может и наоборот - отправляешь 1 пакет на 1000 байт, а получаешь 10 по 100. поэтому сборка/разборка пакетов на tcp несколько более сложная вещь. вообщем, почитай для начала литературу
Что-то прошлая моя винда отказывалась отсылать более 9 килобайт по протоколу UDP, так что эту величину все же лучше считать параметром - никто не может сказать чему будет равно ограничение в следующей версии ОС