Проблема: я создал сырой сокет с протоколом UDP, отправил пакет, состоящий из UDP-заголовка и данных, в PP все нормально, пакет правильный, я тоже создал такой же сокет в другой программе, и он принял данные, которые я отправил, но вместе с заголовком IP. Как же так? Почему об этом нигде не написано?
То есть мы отправляем DATA+UDP, и получаем из того же сокета DATA+UDP+IP.
Вторая программа, получающая данные работает только если к указателю добавить 20, то есть размер IP-заголовка.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define __USE_XOPEN2K
#include
#define AF_INETv4 0x02
#define AF_INETv6 0x0A
int main(int argc, char **argv)
{
int m_socket = socket(AF_INETv4, SOCK_RAW, IPPROTO_UDP);
struct sockaddr_in bnd;
bnd.sin_family = AF_INET;
bnd.sin_port = htons(55555);
bnd.sin_addr.s_addr = inet_addr("127.0.0.1");
bind(m_socket, &bnd, sizeof(bnd));
perror("bind: ");
struct iovec iov;
char buffer[1500 - 14 - 20] = {0};
iov.iov_base = &buffer;
iov.iov_len = sizeof(buffer);
struct udphdr *udp = iov.iov_base;
udp->source = htons(55555);
udp->dest = htons(22222);
udp->len = htons(8);
udp->check = 0;
struct msghdr msg = {0};
msg.msg_flags = 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
struct sockaddr_in in;
in.sin_family = AF_INETv4;
in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
in.sin_port = htons(22222);
msg.msg_name = ∈
msg.msg_namelen = sizeof(struct sockaddr_in);
for(int i = 0; i < 10; i++)
{
sendmsg(m_socket, &msg, 0);
perror("");
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define __USE_XOPEN2K
#include
#define AF_INETv4 0x02
#define AF_INETv6 0x0A
int main(int argc, char **argv)
{
int m_socket = socket(AF_INETv4, SOCK_RAW, IPPROTO_UDP);
struct sockaddr_in bnd;
bnd.sin_family = AF_INET;
bnd.sin_port = htons(22222);
bnd.sin_addr.s_addr = inet_addr("127.0.0.1");
bind(m_socket, &bnd, sizeof(bnd));
perror("bind: ");
struct iovec iov;
char buffer[1500 - 14 - 20] = {0};
iov.iov_base = &buffer;
iov.iov_len = sizeof(buffer);
struct msghdr msg = {0};
msg.msg_flags = 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
struct sockaddr_in in;
in.sin_family = AF_INETv4;
in.sin_addr.s_addr = 0;
in.sin_port = 0;
msg.msg_name = ∈
msg.msg_namelen = sizeof(struct sockaddr_in);
for(int i = 0; i < 10; i++)
{
recvmsg(m_socket, &msg, MSG_ZEROCOPY);
perror("");
struct udphdr *udp = (uint8_t*)iov.iov_base + 20;
uint16_t src = htons(udp->source );
uint16_t dst = htons(udp->dest);
uint16_t len = htons(udp->len);
uint16_t chk = htons(udp->check);
fprintf(stderr, "src: %hu dst: %hu len: %hu chk: %hu\n", src, dst, len, chk);
}
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... ux-sockets
ОШИБКА в сокетах Linux? ⇐ Linux
1719857687
Anonymous
Проблема: я создал сырой сокет с протоколом UDP, отправил пакет, состоящий из UDP-заголовка и данных, в PP все нормально, пакет правильный, я тоже создал такой же сокет в другой программе, и он принял данные, которые я отправил, но вместе с заголовком IP. Как же так? Почему об этом нигде не написано?
То есть мы отправляем DATA+UDP, и получаем из того же сокета DATA+UDP+IP.
Вторая программа, получающая данные работает только если к указателю добавить 20, то есть размер IP-заголовка.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define __USE_XOPEN2K
#include
#define AF_INETv4 0x02
#define AF_INETv6 0x0A
int main(int argc, char **argv)
{
int m_socket = socket(AF_INETv4, SOCK_RAW, IPPROTO_UDP);
struct sockaddr_in bnd;
bnd.sin_family = AF_INET;
bnd.sin_port = htons(55555);
bnd.sin_addr.s_addr = inet_addr("127.0.0.1");
bind(m_socket, &bnd, sizeof(bnd));
perror("bind: ");
struct iovec iov;
char buffer[1500 - 14 - 20] = {0};
iov.iov_base = &buffer;
iov.iov_len = sizeof(buffer);
struct udphdr *udp = iov.iov_base;
udp->source = htons(55555);
udp->dest = htons(22222);
udp->len = htons(8);
udp->check = 0;
struct msghdr msg = {0};
msg.msg_flags = 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
struct sockaddr_in in;
in.sin_family = AF_INETv4;
in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
in.sin_port = htons(22222);
msg.msg_name = ∈
msg.msg_namelen = sizeof(struct sockaddr_in);
for(int i = 0; i < 10; i++)
{
sendmsg(m_socket, &msg, 0);
perror("");
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define __USE_XOPEN2K
#include
#define AF_INETv4 0x02
#define AF_INETv6 0x0A
int main(int argc, char **argv)
{
int m_socket = socket(AF_INETv4, SOCK_RAW, IPPROTO_UDP);
struct sockaddr_in bnd;
bnd.sin_family = AF_INET;
bnd.sin_port = htons(22222);
bnd.sin_addr.s_addr = inet_addr("127.0.0.1");
bind(m_socket, &bnd, sizeof(bnd));
perror("bind: ");
struct iovec iov;
char buffer[1500 - 14 - 20] = {0};
iov.iov_base = &buffer;
iov.iov_len = sizeof(buffer);
struct msghdr msg = {0};
msg.msg_flags = 0;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
struct sockaddr_in in;
in.sin_family = AF_INETv4;
in.sin_addr.s_addr = 0;
in.sin_port = 0;
msg.msg_name = ∈
msg.msg_namelen = sizeof(struct sockaddr_in);
for(int i = 0; i < 10; i++)
{
recvmsg(m_socket, &msg, MSG_ZEROCOPY);
perror("");
struct udphdr *udp = (uint8_t*)iov.iov_base + 20;
uint16_t src = htons(udp->source );
uint16_t dst = htons(udp->dest);
uint16_t len = htons(udp->len);
uint16_t chk = htons(udp->check);
fprintf(stderr, "src: %hu dst: %hu len: %hu chk: %hu\n", src, dst, len, chk);
}
return 0;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78693607/bug-in-linux-sockets[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия