Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Yandex
3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 63

Сервер принимает пакеты если клиент указывает неверный порт получателя UDP.

11.02.2016, 10:47. Показов 1169. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот возникла проблема не могу понять почему сервер принимает пакеты если клиент указывает неверный порт получателя UDP. Кто то может пояснить почему так?
Сервер:
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
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#include <wspiapi.h>
#include <iostream>
#pragma comment ( lib, "ws2_32.lib" )
 
using namespace std;
 
SOCKADDR safrom;
int fromlen,rc;
char *buffer;
struct addrinfo *ressrc,hints;
WSADATA wsd;
SOCKET s;
//#define SIO_RCVALL         0x98000001
typedef unsigned char   UCHAR;
typedef unsigned short  USHORT;
typedef unsigned int    UINT;
 
// Структура заголовка IP-пакета
typedef struct headerIPv4
{
    UCHAR  verlen;        /* 4-розрядний версія(IPv4)                        1 байт
                             4-бітова довжина заголовка (в 32-бітних слів)         */
    UCHAR  tos;           // Тип IP сервісу                                   1 байт
    USHORT totallength;   // Загальна довжина                                2 байта
    USHORT id;            // Унікальний ідентифікатор                        2 байта
    USHORT offset;        // Фрагмент зміщення поля                         2 байта 
    UCHAR  ttl;           // Час життя                                      1 байт
    UCHAR  protocol;      // Протокол(TCP, UDP, ...)                        1 байт
    USHORT checksum;      // Контрольна сума IP                               2 байта
    UINT   srcaddr;       // Адреса джерела                                    4 байта
    UINT   destaddr;      // Адреса отримувача                              4 байта
} HDR_IPV4;
 
typedef struct headerUDP
{
    USHORT src_portno;      // Source port no.
    USHORT dst_portno;      // Dest. port no.
    USHORT length;          // Udp packet length
    USHORT checksum;        // Udp checksum
} HDR_UDP;
 
int _cdecl main()
{
    WSAStartup(MAKEWORD(2,2), &wsd);
    //hints.ai_family = AF_INET;
    //hints.ai_socktype = SOCK_RAW;
 
    //hints.ai_socktype = SOCK_DGRAM;
 
    //hints.ai_protocol = IPPROTO_IP;
    //getaddrinfo("127.0.0.1", "4000", &hints, &ressrc);
    //s = socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol);
    s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
 
    //unsigned long opt = 1;
    //int fro = sizeof(opt);
    // ioctlsocket(s, SIO_RCVALL, &opt);
    // getsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *) &opt, &fro);
    // s = socket(ressrc->ai_family, SOCK_DGRAM, ressrc->ai_protocol);
 
    buffer = (char *)HeapAlloc(GetProcessHeap(), 0, 128);
 
    sockaddr_in sock;
    sock.sin_addr.s_addr = inet_addr("127.0.0.1"); //v4hdr->destaddr;
    sock.sin_family = AF_INET;
    sock.sin_port = ntohs(4004); //udphdr->dst_portno;
    //bind(s, ressrc->ai_addr, ressrc->ai_addrlen);
    bind(s, (sockaddr *)&sock, sizeof(sock));
 
    UCHAR *hdr = new UCHAR[128];
    while (1)
    {
        fromlen = sizeof(safrom);
        rc = recvfrom(s, buffer, 128, 0, (SOCKADDR *)&safrom, &fromlen);
        //rc = recv(s, (char*)&buffer[0], sizeof(buffer), 0);
        //if(rc > 1){
        //memcpy(hdr, buffer, 128);
         if( rc >= sizeof(HDR_IPV4) )
         {
            HDR_IPV4 *ip = (HDR_IPV4*)buffer;
            char g[8];
            for(int i = 20; i < 28; i++)
                g[i-20]=buffer[i];
            HDR_UDP *udp = (HDR_UDP*)g;
            cout  << htons(udp->dst_portno)<<"\n";
            printf("Read %d bytes from \n", rc);
            cout << ip->id << " " << ip->ttl << "\n";
         }
    }
 
}
Клиент:
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
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment ( lib, "ws2_32.lib" )
 
#include "packetNet.h"
 
HDR_UDP *udphdr;
HDR_IPV4 *v4hdr;
char *buffer;
int _cdecl main(int argc, char **argv)
{
    printf("--- STEGO IP CLIENT DEMO ---\n");
 
    WSADATA wsd;
    printf("WSAStartup: ");
    if(WSAStartup(MAKEWORD(2, 2), &wsd) == SOCKET_ERROR)
    {
        printf("\tERROR %d\n", GetLastError());
        WSACleanup();
        return -1;
    } else printf("\tOK\n");
 
    SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
    printf("SOCKET: ");
    if(s == INVALID_SOCKET)
    {
        printf("\tERROR %d\n", GetLastError());
        WSACleanup();
        return -1;
    } else printf("\tOK\n");
 
    int optval = 1;
    printf("SETSOCKOPT: ");
    if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&optval, sizeof(optval)))
    {
        printf("\tERROR %d\n", WSAGetLastError());
        closesocket(s);
        WSACleanup();
        return -1;
    } else printf("\tOK\n");
 
    buffer = (char *)HeapAlloc(GetProcessHeap(), 0, 128);
    udphdr = (HDR_UDP *)(buffer + SIZE_IP_PACKET);
    udphdr->src_portno = ntohs(6000);
    udphdr->dst_portno = ntohs(5000); // порт получателя
    udphdr->length = htons(SIZE_UDP_PACKET + 10);
 
    int size_pack = SIZE_IP_PACKET + SIZE_UDP_PACKET;
    v4hdr = (HDR_IPV4 *)buffer;
    v4hdr->verlen = (4 << 4) | (SIZE_IP_PACKET / sizeof(unsigned long));
    v4hdr->tos = 0;
    v4hdr->totallength = htons(size_pack + 10);
    v4hdr->id = 17520;
    v4hdr->offset = 0;
    v4hdr->ttl = (UCHAR) 8;
    v4hdr->protocol = (UCHAR) IPPROTO_UDP;
    v4hdr->checksum = 0;
    v4hdr->srcaddr = inet_addr("127.0.0.1");
    v4hdr->destaddr = inet_addr("127.0.0.1");
    v4hdr->checksum = checksum((USHORT *)v4hdr, SIZE_IP_PACKET);
    
    memcpy(buffer + size_pack, "vijaymukh7", 10);
 
    sockaddr_in sock;
    sock.sin_addr.s_addr = v4hdr->destaddr;
    sock.sin_family = AF_INET;
    sock.sin_port = udphdr->dst_portno;
    
    int mem = sendto(s, buffer, size_pack + 10, 0, (sockaddr *)&sock, sizeof(sock));
    printf("Send %d byte", mem);    
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2016, 10:47
Ответы с готовыми решениями:

COM-порт принимает не все пакеты
И так, у меня есть программа которая работает с com-портом. Но проблема в том, что не всегда он получает все пакеты(где-то что-то теряет)....

TCP сервер принимает укороченные пакеты
Создал (Visual Studio 6.0 на простом &quot;C&quot;) самое простое клиент-серверное приложение: клиент посылает серверу (по TCP протоколу) 10...

UDP клиент на сокетах - порты, с которых принимает recvfrom
Здравствуйте! Есть вопрос по UDP, постараюсь подробно сформулировать. Ситуация 1: На хосте А на порту 666 есть UDP эхо-сервер...

3
-L
15 / 9 / 12
Регистрация: 03.12.2015
Сообщений: 79
14.02.2016, 20:43
Разве не наоборот должно быть: sock.sin_port = htons(4004); вместо ntohs?
0
 Аватар для Yandex
3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 63
14.02.2016, 23:37  [ТС]
Цитата Сообщение от -L Посмотреть сообщение
Разве не наоборот должно быть: sock.sin_port = htons(4004); вместо ntohs?
Я устанавливал по разному и htons, и ntohs. Но вот не много я полазил по Интернету и книгам и понял, что приложение написанные на raw_socket является беспортовыми приложениями. Поэтому система пересылает все полученные пакеты всем приложениям (портам), чьи сокеты зафиксированы как raw. (если не ошибаюсь)
0
-L
15 / 9 / 12
Регистрация: 03.12.2015
Сообщений: 79
15.02.2016, 00:13
Yandex, похоже на правду. http://stackoverflow.com/quest... cific-port
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2016, 00:13
Помогаю со студенческими работами здесь

Сервер UDP принимающий/передающий пакеты от всех/всем клиентам
Написан клиент, который передает пакеты на север. Помощь нужна в следующем. Мне нужно чтобы приходящие пакеты на сервер сразу были...

Клиент-сервер. Клиент не принимает данные
Здравствуйте о светлейшие умы сего мира! Я работаю над одним проектом, а именно написание многопользовательской онлайн игры, и собственно...

UDP клиент сервер
Помогите пожалуйста сделать &quot;Получение по запросу имени компьютера, физического адреса, IP-адреса.&quot; Есть такое, но оно выводит в...

UDP Клиент-Сервер
На этот раз мне надо реализовать клиент-серверное приложение использую UDP. В интернете прочитал, простой Эхо сервер сделал. А вот дальше...

UDP Клиент-Сервер
Здравствуйте! Написала два приложения: клиент и сервер. Обработала, чтобы клиент мог отправлять данные несколько раз. Вопрос: как...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru