Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
11 / 11 / 1
Регистрация: 09.04.2009
Сообщений: 66

Приём сырых сокетов

07.12.2012, 19:39. Показов 1311. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Отправляю сырой сокет следующим кодом, но принять никак не могу.
ОС: ubuntu

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    //Create a raw socket
    int s = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
 
    if(s == -1)
    {
        //socket creation failed, may be because of non-root privileges
        ui->textBrowser->append("Failed to create socket");
    }
 
    //Datagram to represent the packet
    char datagram[4096] , source_ip[32] , *data , *pseudogram;
 
    //zero out the packet buffer
    memset (datagram, 0, 4096);
 
    //IP header
    struct iphdr *iph = (struct iphdr *) datagram;
 
    //TCP header
    struct tcphdr *tcph = (struct tcphdr *) (datagram + sizeof (struct ip));
    struct sockaddr_in sin;
    struct pseudo_header psh;
 
    //Data part
    data = datagram + sizeof(struct iphdr) + sizeof(struct tcphdr);
    strcpy(data , "Request for new MAC");
 
    //some address resolution
    ui->textBrowser->append("Request will be send from IP  "+getCurrentIp().toAscii() + "\n");
    strcpy(source_ip , getCurrentIp().toAscii());
    sin.sin_family = AF_INET;
    sin.sin_port = htons(4242);
    sin.sin_addr.s_addr = inet_addr(_SERVER_IP);
 
    //Fill in the IP Header
    iph->ihl = 5;
    iph->version = 4;
    iph->tos = 0;
    iph->tot_len = sizeof (struct iphdr) + sizeof (struct tcphdr) + strlen(data);
    iph->id = htonl (54321);    //Id of this packet
    iph->frag_off = 0;
    iph->ttl = 255;
    iph->protocol = IPPROTO_TCP;
    iph->check = 0;     //Set to 0 before calculating checksum
    iph->saddr = inet_addr ( source_ip );
    iph->daddr = sin.sin_addr.s_addr;
 
    //Ip checksum
    iph->check = csum ((unsigned short *) datagram, iph->tot_len);
 
    //TCP Header
    tcph->source = htons (4242);
    tcph->dest = htons (4242);
    tcph->seq = 0;
    tcph->ack_seq = 0;
    tcph->doff = 5; //tcp header size
    tcph->fin=0;
    tcph->syn=1;
    tcph->rst=0;
    tcph->psh=0;
    tcph->ack=0;
    tcph->urg=0;
    tcph->window = htons (5840);    /* maximum allowed window size */
    tcph->check = 0;    //leave checksum 0 now, filled later by pseudo header
    tcph->urg_ptr = 0;
 
    //Now the TCP checksum
    psh.source_address = inet_addr( source_ip );
    psh.dest_address = sin.sin_addr.s_addr;
    psh.placeholder = 0;
    psh.protocol = IPPROTO_TCP;
    psh.tcp_length = htons(sizeof(struct tcphdr) + strlen(data) );
 
    int psize = sizeof(struct pseudo_header) + sizeof(struct tcphdr) + strlen(data);
    pseudogram = (char*)malloc(psize);
 
    memcpy(pseudogram , (char*) &psh , sizeof (struct pseudo_header));
    memcpy(pseudogram + sizeof(struct pseudo_header) , tcph , sizeof(struct tcphdr) + strlen(data));
 
    tcph->check = csum( (unsigned short*) pseudogram , psize);
 
    //IP_HDRINCL to tell the kernel that headers are included in the packet
    int one = 1;
    const int *val = &one;
 
    if (setsockopt (s, IPPROTO_IP, IP_HDRINCL, val, sizeof (one)) < 0)
    {
        ui->textBrowser->append("!!Error setting IP_HDRINCL!! \n");
    }
 
    //Send the packet
    if (sendto (s, datagram, iph->tot_len , 0, (struct sockaddr *) &sin, sizeof (sin)) < 0)
    {
        ui->textBrowser->append("sendto failed");
    }
    //Data send successfully
    else
    {
        ui->textBrowser->append(QString("Packet Send. Length : %1 \n").arg(iph->tot_len));
    }


на другой стороне создаю сокет с параметрами

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int sockfd;
    struct addrinfo hints, *res;
 
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE; // fill in my IP for me
    getaddrinfo(NULL, "3490", &hints, &res);
    // make a socket:
    sockfd = socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
    // bind it to the port we passed in to getaddrinfo():
    bind(sockfd, res->ai_addr, res->ai_addrlen);
    
    char buff[70] = "";
    for(int i=0;i<5;i++){
    recv(sockfd,buff,sizeof(buff),0);
    qDebug()<< buff;
    }


Но в выводе только буква Е

Что делать?
Сижу уже целый день перепробовал много вариантов создания сокета на второй стороне, многие не работали вообще,
а остальные возвращают E.
Как поймать сырой сокет на второй стороне?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2012, 19:39
Ответы с готовыми решениями:

Простой клиент-сервер с использованием сырых сокетов
Здравствуйте! Уже целую неделю бьюсь над вопросом &quot;Как создать простой клиент-сервер с использованием сырых сокетов (raw sockets)?&quot;...

Создание сырых сокетов
Есть программа которая создает сырые сокеты, для этого ее нужно запускать от супер пользователя. Можно это как нибудь обойти? Указать...

Приём сокетов
Добрый день Подскажите каким образом можно принять сокет с сервера ip + port В интернете много уроков прочитал но так и не понял как...

1
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.12.2012, 20:22
Цитата Сообщение от Barmaley Посмотреть сообщение
Но в выводе только буква Е
Я хз что такое qDebug, но почему-то уверен, что наткнувшись на первый же '\0' он прекращает печатать (E это версия и размер, 0 соответственно tos), т.е. все хорошо...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2012, 20:22
Помогаю со студенческими работами здесь

Прием и отправка сообщений с использование сокетов
Здравствуйте. Нашел в интернете образец кода сервера который оказался бы для меня весьма полезным. Проблема в том что я не могу понять в...

Отличие Web сокетов от сокетов в Boost Asio
Здравствуйте, Кто нибудь может пожалуйста подсказать, есть ли различие между WebSocket и сокетами в Boost asio и если есть, то в чем...

Асинхронные сокеты: Как организовать разделение на прием сообщений и прием файлов
Изучив синхронные сокеты, перешел к изучению асинхронных. Столкнулся вот с чем, как, используя асинхронные сокеты, сделать на стороне...

Запись сырых данных в QImage
Всем привет. Имеется QImage типа QImage::Format_Indexed8. Программно задаю для него палитру и размеры. А заполнить хочу из QByteArray...

Как декларировать параметр из 8-ми сырых байт?
Как декларировать параметр из 8-ми сырых байт? При вызове с фактическим параметром типа double приведение типа должно происходить без...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru