Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/124: Рейтинг темы: голосов - 124, средняя оценка - 4.86
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326

Прием пакетов по UDP

16.10.2012, 21:13. Показов 24128. Ответов 30

Студворк — интернет-сервис помощи студентам
Приветствую. С сетевыми протоколами раньше дела не имел.
Начал сразу к практике приступать. Хотел посмотреть, как вообще реализовать прием данных по протоколу ЮДП.
Набрал литературный код.
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
101
102
103
104
//---------------------------------------------------------------------------
 
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <vcl.h>
#include <windows.h>
 
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
 
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
//---------------------------------------------------------------------------
typedef struct IPHeader {
  UCHAR   iph_verlen;   
  UCHAR   iph_tos;      
  USHORT  iph_length;  
  USHORT  iph_id;       
  USHORT  iph_offset;   
  UCHAR   iph_ttl;     
  UCHAR   iph_protocol; 
  USHORT  iph_xsum;    
  ULONG   iph_src;      
  ULONG   iph_dest;    
} IPHeader;
char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
//---------------------------------------------------------------------------
int main(void)
{
 
  WSADATA     wsadata;   
  SOCKET      s;       
  char        name[128]; 
  HOSTENT*    phe;      
  SOCKADDR_IN sa;       
  IN_ADDR sa1;        
  unsigned long        flag = 1;  
 
  
  WSAStartup(MAKEWORD(2,2), &wsadata);
  s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
  gethostname(name, sizeof(name));
  phe = gethostbyname( name );
  ZeroMemory( &sa, sizeof(sa) );
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
  bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
 
 
  ioctlsocket(s, SIO_RCVALL, &flag);
 
 
  while( !_kbhit() )
  {
    unsigned int count;
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    
    if( count >= sizeof(IPHeader) )
    {
      IPHeader* hdr = (IPHeader *)Buffer;
      
 
    strcpy_s(src,"Ïàêåò: ");
    //CharToOem(src,dest);
    //system (dest);
    printf(dest);
    // Ïðåîáðàçóåì â ïîíÿòíûé âèä àäðåñ îòïðàâèòåëÿ.
    printf("From ");
    sa1.s_addr = hdr->iph_src;
    printf(inet_ntoa(sa1));
 
    
    printf(" To ");
    sa1.s_addr = hdr->iph_dest;
    printf(inet_ntoa(sa1));
 
   
    printf(" Prot: ");
    if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
    if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
 
    
    printf("Size: ");
    lowbyte = hdr->iph_length>>8;
    hibyte = hdr->iph_length<<8;
    hibyte = hibyte + lowbyte;
   
    printf("%u", hibyte);
 
   
    printf(" TTL:%s",itoa(hdr->iph_ttl,ds,10));
    printf("\n");
 
    }
  }
 
  closesocket( s );
  WSACleanup();
}
ругается на то, что не может открыть "stdafx.h".
ну и на _kbhit и на strcpy_s.

в чем ошибка, подскажите пожалуйста.

Добавлено через 45 минут
и где находится компонент TIdThreadComponent
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2012, 21:13
Ответы с готовыми решениями:

Прием UDP пакетов асинхронном режиме
Добрый день. мне необходимо принимать все UDP пакеты приходящие на порт 888. Поделитесь, плиз, примером асинхронного приема UDP...

Прием и отправка пакетов
Всем привет! Нужно отправить определенной структуры пакет серверу на порт 28000. Так выглядит структура пакета: ...

Потери UDP пакетов
Всем здравствуйте...Столкнулся со следующей проблемой. Попытался передать довольно большой файл по сети UDP пакетами размером в пару сотен...

30
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
16.10.2012, 21:53
Цитата Сообщение от log Посмотреть сообщение
ругается на то, что не может открыть "stdafx.h".
ну и на _kbhit и на strcpy_s.
А какой компилятор-то? Этот код писан, судя по всему, под MSVC++ 2005 и старше......
0
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
16.10.2012, 21:59  [ТС]
CheshireCat, поменял. вроде пашет.
только в появившемся окне не вижу никаких пакетов. просто консоль открывается.

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
//---------------------------------------------------------------------------
 
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <vcl.h>
#pragma comment (lib, "ws2_32.lib")
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
 
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
 
 
 
typedef struct IPHeader {
  UCHAR   iph_verlen;   
  UCHAR   iph_tos;      
  USHORT  iph_length;   
  USHORT  iph_id;       
  USHORT  iph_offset;  
  UCHAR   iph_ttl;      
  UCHAR   iph_protocol; 
  USHORT  iph_xsum;     
  ULONG   iph_src;      
  ULONG   iph_dest;    
} IPHeader;
 
char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
 
int main(void)
{
 
  WSADATA     wsadata;   
  SOCKET      s;        
  char        name[128]; 
  HOSTENT*    phe;       
  SOCKADDR_IN sa;      
  IN_ADDR sa1;       
  unsigned long        flag = 1;  
 
  
  WSAStartup(MAKEWORD(2,2), &wsadata);
  s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
  gethostname(name, sizeof(name));
  phe = gethostbyname( name );
  ZeroMemory( &sa, sizeof(sa) );
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
  bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
 
 
  ioctlsocket(s, SIO_RCVALL, &flag);
 
 
  while(1)
  {
    int count;
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    
    if( count >= sizeof(IPHeader) )
    {
      IPHeader* hdr = (IPHeader *)Buffer;
     
 
    strcpy(src,"Пакет: ");
    printf(dest);   
    printf("From ");
    sa1.s_addr = hdr->iph_src;
    printf(inet_ntoa(sa1));
    printf(" To ");
    sa1.s_addr = hdr->iph_dest;
    printf(inet_ntoa(sa1));
    printf(" Prot: ");
    if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
    if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
    printf("Size: ");
    lowbyte = hdr->iph_length>>8;
    hibyte = hdr->iph_length<<8;
    hibyte = hibyte + lowbyte;
    printf("%u", hibyte);
    printf(" TTL:%s",itoa(hdr->iph_ttl,ds,10));
    printf("\n");
 
    }
  }
 
  closesocket( s );
  WSACleanup();
}
но вопрос в силе) где находится компонент TIdThreadComponent. понимаю что это элемент класса. но как его на форму поместить. откуда брать
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
16.10.2012, 22:27
по моему слишком круто для начала разбора. может с малого?
Несколько UDP портов
1
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
17.10.2012, 21:05  [ТС]
Я просто хочу реализовать простой прием пакетов.
Сервер(стоит на моей машине), который по ЮДП соединен с другим компом, а тот в свою очередь посылает данные моей машине.
Мне желательно эти данные сохранять в файл или выводить на форму.

Попробовал реализовать, но ничего не выходит. Данные поступают, а это не отражается в memo.

Использовал ЮДП сервер (ИНДИ)

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
101
102
103
104
105
106
107
108
#include <iostream> //  ???????? ????? ?????????
#include <string>   //  ??? ?????
#include <fstream>  //  ??? ?????? ? ???????
#include <iomanip>  //  ??? ???????????
#include <vcl.h>
#include <winsock2.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
AnsiString __fastcall DataGrammMessageID(char *data)
{
AnsiString s;
for (int i = 4; i < 14; ++i) {
s += AnsiString::StringOfChar(data[i], 1);
}
return s;
}
 
AnsiString __fastcall DataGrammModemID(char *data)
{
AnsiString s;
for (int i = 15; i < 36; ++i) {
s += AnsiString::StringOfChar(data[i], 1);
}
return s;
}
 
 
AnsiString __fastcall DataGrammAnalogValie(char *data)
{
AnsiString s;
for (int i = 37; i < 41; ++i) {
s += AnsiString::StringOfChar(data[i], 1);
}
return s;
}
 
 
AnsiString __fastcall Dump(void *data, int size, int col,
bool hex, const AnsiString &pref)
{
AnsiString s;
for (int i = 0; i < size; ++i) {
if (!i)
s += pref;
else if (col && !(i % col)) {
s += "\n";
s += pref;
}
if (hex)
s += IntToHex(((unsigned char*)data)[i], 2) + " ";
else {
AnsiString s1 = int(((unsigned char*)data)[i]);
while (s1.Length() < 3)
s1 = " " + s1;
s += s1 + " ";
}
}
return s;
}
 
 
void __fastcall TForm1::IdUDPServer1UDPRead(TObject *Sender,
      TStream *AData, TIdSocketHandle *ABinding)
{
 char My[200];
TDateTime DateMy;
TDateTime TimeMy;
AnsiString MyDump;
 
AData->ReadBuffer(My, AData->Size);
My[AData->Size]=0;
MyDump=Dump(My, AData->Size, 0, true, "");
 
DateMy = Date();
AnsiString strDate = DateToStr(DateMy);
TimeMy = Time(); // store the current date and time
AnsiString strTime = TimeToStr(TimeMy);
 
Memo1->Lines->Add(strDate+" "+strTime+":"+
"IP:"+ABinding->PeerIP+":"+"Port:"+ABinding->PeerPort+":"+"Size:"+AData->Size+":"+"Data:"+MyDump);
if(AData->Size==42)
{
int a= DataGrammAnalogValie(My).ToInt();
float b=a*0.001709;
Memo2->Lines->Add(DataGrammMessageID(My)+" "+DataGrammModemID(My)+" "+CurrToStr(b));
 
FILE* MyAnalogValue;
char* h=" ";
char* u="U=";
MyAnalogValue=fopen("analog_value.log","a");
fprintf(MyAnalogValue,"%s %s %s %s %s %s %s %s %s %s \n",strDate.c_str(), h, strTime.c_str(),
h, DataGrammMessageID(My).c_str(), h, DataGrammModemID(My).c_str(),fclose(MyAnalogValue));
}
else
{
Memo2->Lines->Add("The format of the datagram is not supported");
}}
Все компилится, но как уже написал, ничего не происходит.
Прошу вашей профессиональной помощи. не против, если на мою поставленную задачу, будут приведены другие коды.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
17.10.2012, 22:02
см. по ссылке которую я дал -там сама по себе тема про удп, а по ссылкам из той темы вообще полно кодов от космических серверных движков до элементарной отправки любых нужных тебе данных через UDP без всяких компонентов при помощи сокетов. предметно - вот здесь
Программирование сокетов, ругается код
по ссылке socket(udp)
а вот здесь текстом
https://www.cyberforum.ru/c-li... ost2530913
1
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
21.10.2012, 12:39  [ТС]
vxg, я не могу найти пример кода, где сервер мог бы принимать постоянно данные, к примеру результаты каких то подсчетов, по ЮДП через конкретный порт, где после их обрабатывает и сохраняет в файл.

прошу прощения за многократное повторение, но плохо разбираюсь в сетевом.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
21.10.2012, 22:24
смотря что за данные
вот например как бы консольная аська - оба человека запускают сервер и клиент - в сервер валяться входящие с клиента уходят исходящие сообщения. данные в этом случае - строки оканчивающиеся нулем. размер данных не должен быть чудовищным иначе система может его не пропихнуть. пакеты могут приходить не в том порядке в котором были отправлены (по факту они почти всегда приходят как надо, но протокол этого не гарантирует)
клиент
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
//------------------------------------------------------------------------------
#include <winsock>
#include <iostream>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    std::string ip;
    int port;
 
    std::cout << "ip>";
    std::cin >> ip;
    std::cout << "port>";
    std::cin >> port;
    std::cin.ignore();
 
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101)
    {
        std::cout << "WSAStartup error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET)
    {
        std::cout << "socket error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(port);
    sa.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
 
    std::string message;
    while (true)
    {
        std::cout << ">";
        std::getline(std::cin, message);
        if (message == "exit") break;
        if
        (
            sendto
            (
                s,
                message.c_str(), message.length() + 1,
                0,
                (SOCKADDR *)&sa, sizeof(sa)
            ) == SOCKET_ERROR
        )
        {
            std::cout << "sendto error" << std::endl;
            break;
        }
    }
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
сервер
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
//------------------------------------------------------------------------------
#include <winsock>
#include <conio.h>
#include <iostream>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    std::string ip;
    int port;
 
    std::cout << "ip>";
    std::cin >> ip;
    std::cout << "port>";
    std::cin >> port;
 
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101)
    {
        std::cout << "WSAStartup error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET)
    {
        std::cout << "socket error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(port);
    sa.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
 
    if (bind(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
    {
        std::cout << "bind error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKADDR_IN nsa;
    int sizeof_nsa = sizeof(nsa);
 
    char buffer[1024];
    int buffer_size = sizeof(buffer);
    while (!kbhit())
    {
        if
        (
            recvfrom
            (
                s,
                buffer, buffer_size,
                0,
                (SOCKADDR *)&nsa, &sizeof_nsa
            ) == SOCKET_ERROR
        )
        {
            std::cout << "recvfrom error" << std::endl;
            break;
        }
        std::cout << inet_ntoa(nsa.sin_addr) << ">" << buffer << std::endl;
    }
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
2
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
22.10.2012, 20:17  [ТС]
vxg,
спасибо большое.
но, что если обойтись без клиента. к примеру запускается программа на другом языке на одной машине (я не пишу эту программу и все, что знаю это айпишник того компа и порт по которому она передает) и свои результаты она шлет на другой компьютер(на мой, где собственно, я и хочу запустить сервер юдп). мне же нужно обработать эти данные и сохранить в файл.

Добавлено через 2 часа 19 минут
данные для передачи числа. 4.2312312 потом 2.4343534534 и так далее. их может быть тысячи
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
22.10.2012, 22:37
конечно вам не обязательно писать и клиент и сервер. пишите то, что требует ваша задача. а чего именно она требует пока не ясно. каков порядок общения вашей программы с другой? кто инициирует это общение и как? в каком виде приходят запросы/ответы? вы говорите просто числа. в текстовом формате? разделенные пробелом? передаются широковещательно?
1
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
22.10.2012, 22:54  [ТС]
сначала запускается программа на другом компьютере. там запущен автоматический калькулятор.
он оперирует с большим количеством чисел и совершает простые операции. результат этих операций должен ловить мой сервер. пока, эти результаты мне нужно лишь сохранять в файл. пускай без всякой обработки.
подсчитываются и выводятся на экран они на первом компьютере в консольном окне. но в том автоматическом калькуляторе прописан порт передачи и ай пи моего ком-ра. они разделены пробелом, а вот про широковещательную передачу не думаю.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
22.10.2012, 23:06
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
//------------------------------------------------------------------------------
#include <winsock>
#include <conio.h>
#include <iostream>
#include <sstream>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    std::string ip;
    int port;
 
    std::cout << "ip>";
    std::cin >> ip;
    std::cout << "port>";
    std::cin >> port;
 
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101)
    {
        std::cout << "WSAStartup error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET)
    {
        std::cout << "socket error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(port);
    sa.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
 
    if (bind(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
    {
        std::cout << "bind error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKADDR_IN nsa;
    int sizeof_nsa = sizeof(nsa);
 
    char buffer[1024]; //ðàçìåð äîëæåí áûòü áîëüøå ëèáî ðàâåí ìàêñèìàëüíîìó ðàçìåðó ïàêåòà êîòîðûé ìîæåò ïðèñëàòü íàì óäàëåííàÿ ìàøèíà
    int buffer_size = sizeof(buffer);
    while (!kbhit())
    {
        int data_size = recvfrom
        (
            s,
            buffer, buffer_size,
            0,
            (SOCKADDR *)&nsa, &sizeof_nsa
        );
        if (data_size == SOCKET_ERROR)
        {
            std::cout << "recvfrom error" << std::endl;
            break;
        }
        std::stringstream ss;
        ss.write(buffer, data_size);
        while (!ss.eof())
        {
            double x;
            ss >> x;
            std::cout << x << std::endl;
        }
    }
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
Добавлено через 1 минуту
...будет выводить все что зашлет нам удаленная машина - каждое число в отдельной строке
1
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
23.10.2012, 21:08  [ТС]
vxg, спасибо огромное. буду разбираться в коде. завтра отпишусь

Добавлено через 21 час 51 минуту
vxg, код линкуется, но не видит сеть. пишет ошибку бинда.

в итоге подправил другой код
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
101
102
103
104
105
106
107
//---------------------------------------------------------------------------
 
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <vcl.h>
#pragma comment (lib, "ws2_32.lib")
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
// Буфер для приёма данных
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
 
//Структура заголовка IP-пакета
 
typedef struct IPHeader {
  UCHAR   iph_verlen;   // версия и длина заголовка
  UCHAR   iph_tos;      // тип сервиса
  USHORT  iph_length;   // длина всего пакета
  USHORT  iph_id;       // Идентификация
  USHORT  iph_offset;   // флаги и смещения
  UCHAR   iph_ttl;      // время жизни пакета
  UCHAR   iph_protocol; // протокол
  USHORT  iph_xsum;     // контрольная сумма
  ULONG   iph_src;      // IP-адрес отправителя
  ULONG   iph_dest;     // IP-адрес назначения
} IPHeader;
 
char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
 
int main(void)
{
 
  WSADATA     wsadata;   // Инициализация WinSock.
  SOCKET      s;         // Cлущающий сокет.
  char        name[128]; // Имя хоста (компьютера).
  HOSTENT*    phe;       // Информация о хосте.
  SOCKADDR_IN sa;        // Адрес хоста
  IN_ADDR sa1;        //
  unsigned long        flag = 1;  // Флаг PROMISC Вкл/выкл.
 
  // инициализация
  WSAStartup(MAKEWORD(2,2), &wsadata);
  s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
  gethostname(name, sizeof(name));
  phe = gethostbyname( name );
  ZeroMemory( &sa, sizeof(sa) );
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
  bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
 
  // Включение promiscuous mode.
  ioctlsocket(s, SIO_RCVALL, &flag);
 
  // Бесконечный цикл приёма IP-пакетов.
  while(1)
  {
    int count;
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    // обработка IP-пакета
    if( count >= sizeof(IPHeader) )
    {
      IPHeader* hdr = (IPHeader *)Buffer;
      //Начинаем разбор пакета...
 
    strcpy(src,"Пакет: ");
    //CharToOem(src,dest);
    //system (dest);
    printf(dest);
    // Преобразуем в понятный вид адрес отправителя.
    printf("From ");
    sa1.s_addr = hdr->iph_src;
    printf(inet_ntoa(sa1));
 
    // Преобразуем в понятный вид адрес получателя.
    printf(" To ");
    sa1.s_addr = hdr->iph_dest;
    printf(inet_ntoa(sa1));
 
    // Вычисляем протокол. Полный список этих констант
    // содержится в файле winsock2.h
    printf(" Prot: ");
    if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
    if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
 
    // Вычисляем размер. Так как в сети принят прямой порядок
    // байтов, а не обратный, то прийдётся поменять байты местами.
    printf("Size: ");
    lowbyte = hdr->iph_length>>8;
    hibyte = hdr->iph_length<<8;
    hibyte = hibyte + lowbyte;
    //printf("%s",itoa(hibyte,ds,10));
    printf("%u", hibyte);
 
    // Вычисляем время жизни пакета.
    printf(" TTL:%s",itoa(hdr->iph_ttl,ds,10));
    printf("\n");
 
    }
  }
 
  closesocket( s );
  WSACleanup();
}
все принимает. выдает айпи, протокол и размер пакета.

но как выводить пакет в консоль, то есть само содержание пакета я не знаю.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
23.10.2012, 23:50
ошибки быть не должно вообще то. во всяком случае код сделан из тех примеров, что я посылал вам раньше, а они живые - я их локально обкатывал.
в вашем коде данные пакета лежат в буфере после заголовка. вывести как-то так
C++
1
2
3
4
5
6
7
8
        std::stringstream ss;
        ss.write(Buffer + sizeof(IPHeader), count - sizeof(IPHeader));
        while (!ss.eof())
        {
            double x;
            ss >> x;
            std::cout << x << std::endl;
        }
1
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
28.10.2012, 12:50  [ТС]
vxg, ошибки и нет как таковой.
просто не видит сеть. может он просто те пакеты увидеть не может? пробовал менять размер, все равно никак...

C++
1
[C++ Error] Unit1.cpp(104): E2316 'stringstream' is not a member of 'std'
выводит ошибку, при вставке вашего фрагмента.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
29.10.2012, 09:51
1 обратите внимание на
C++
1
#include <sstream>
2 пришло в голову: ошибка bind происходит наверное от того, что вы указываете IP-адрес клиента. нужно указывать IP-адрес сервера (адрес конкретного адаптера на котором вы ожидаете прием пакетов или 127.0.0.1 если вы ожидаете приема пакетов от программы запущенной на том же компьютере или 0.0.0.0 если вы ожидаете приема пакетов с любых направлений)
3 в коде надо поправить (в прошлом коде eof() не отрабатывал. не знаю от чего)
C++
1
while (ss.peek() != EOF)
1
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
29.10.2012, 18:54  [ТС]
теперь ругается, что
C++
1
2
[C++ Error] Unit1.cpp(59): E2451 Undefined symbol 'count'
[C++ Error] Unit1.cpp(65): E2316 'cout' is not a member of 'std'
после подключения
C++
1
#include <iostream.h>
выводит ошибку
C++
1
[C++ Error] Unit1.cpp(59): E2335 Overloaded 'count' ambiguous in this context
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
29.10.2012, 19:49
обратите внимание
C++
1
#include <iostream>
не
C++
1
#include <iostream.h>
0
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
29.10.2012, 19:59  [ТС]
vxg, та же ошибка вылетает
C++
1
[C++ Error] Unit1.cpp(59): E2335 Overloaded 'count' ambiguous in this context
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
29.10.2012, 20:17
cout не count
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2012, 20:17
Помогаю со студенческими работами здесь

Прием по UDP и передача на RS232
Имеется программа, которая передает через UDP протокол некую информацию. Необходимо перенаправить эту информацию на COM порт, где ее будет...

Отправка UDP пакетов с задержкой в 5 мкс
Здравствуйте.Как раз не давно с толкнулся с проблемой реализации отправки UDP пакетов с задержкой в 5 мкс.Хотел использовать функцию...

Заголовки пакетов ( ip / tcp / udp / icmp )
Есть сниффер , приходит пакет , в файл сохраняю информацию о заголовке . Проблема в том что поля IPHeader в файл записывается (вроде)...

Вывод udp пакетов. Непонятен код. Небольшая часть кода
Нашел на просторах интернета вот такой код... вернее здесь я убрал лишние хэйдеры и некоторые не используемые переменные, скомпилировал -...

Прием фрагментированных кадров UDP
Добрый день. Возникла проблема с приемом данных UDP. Есть устройство, которое посылает по UDP данные. Пакеты с IP фрагментацией,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru