xxxmatrixxx 0 December 14, 2018 Posted December 14, 2018 · Report post Здравствуйте, уважаемые форумчане Возникла такая проблема и пока не нашел решения Я осуществлял обмен через Ethernet, используя сокеты и настраивая их на работу по TCP/IP, вычитывал данные пакета порционально, т.е. например, приходило 30 байт, я вычитывал заголовок 7 байт, а затем относительно него уже думал, что делать с пакетом все вычитывалось через read без проблем Сейчас возникла потребность работать по UDP: создаю сокет и подключаю его на прослушку к конкретному интерфейсу вот так: p_new_eth_dev->eth_dev_fd = socket(AF_INET , SOCK_DGRAM , 0) bind(p_new_eth_dev->eth_dev_fd, (struct sockaddr *)&(p_new_eth_dev->eth_bind_address), sizeof(struct sockaddr_in) затем запускаю поток на прослушку и вычитываю данные так же через read,т.е. read_len = read(port_fd,&(read_data),length); по логу видно, что я затребываю 7 байт(length = 7), мне возвращаются эти 7 байт(read_len = 7) пробовал и через функцию read_len = recv(port_fd,&(read_data),length ,0); с использованием флагов MSG_OOB, MSG_TRUNC , MSG_WAITALL считывается так же, при флаге MSG_PEEK данные не удаляются, как и было обещено в документации как я сказал раньше, пакет у меня 30 байт(для примера, на самом деле он может быть всегда разным по длине, именно по заголовку я узнаю, сколько реально пакет длинной), при вычитывании 7 байт по UDP, хоть пакет и был 30 байт, но они исчезают, такое ощущение, что при чтении 7 байт из 30 у меня из буфера вычитываются все 30 байт сразу возможно ли в UDP считывание частичное пакета, как мне сокет настроить на такой режим работы??? как вообще считывать по UDP, если не знаешь длины пакета, постоянно в тупую максимум кидать и ждать, что вернется? Quote Share this post Link to post Share on other sites More sharing options...
Палыч 17 December 14, 2018 Posted December 14, 2018 · Report post В UDP частично пакет считать нельзя. Но, можно считать пакет не удаляя его из входной очереди: у функции recv (и ей подобных) есть параметр flags. MSG_PEEK - это то значение flags, что Вам нужно. Quote Share this post Link to post Share on other sites More sharing options...