Jump to content
    

Частичное вычитывание пакета, посланного по UDP

Здравствуйте, уважаемые форумчане

Возникла такая проблема и пока не нашел решения

Я осуществлял обмен через 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, если не знаешь длины пакета, постоянно в тупую максимум кидать и ждать, что вернется?

 

Share this post


Link to post
Share on other sites

В UDP частично пакет считать нельзя. Но, можно считать пакет не удаляя его из входной очереди: у функции recv (и ей подобных) есть параметр flags. MSG_PEEK - это то значение flags, что Вам нужно.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...