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

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

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

Author24 — интернет-сервис помощи студентам
Вот возникла проблема не могу понять почему сервер принимает пакеты если клиент указывает неверный порт получателя 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2016, 10:47
Ответы с готовыми решениями:

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

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

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

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

3
-L
15 / 9 / 12
Регистрация: 03.12.2015
Сообщений: 79
14.02.2016, 20:43 2
Разве не наоборот должно быть: sock.sin_port = htons(4004); вместо ntohs?
0
3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 63
14.02.2016, 23:37  [ТС] 3
Цитата Сообщение от -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 4
Yandex, похоже на правду. http://stackoverflow.com/quest... cific-port
0
15.02.2016, 00:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2016, 00:13
Помогаю со студенческими работами здесь

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

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

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

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

UDP Клиент Сервер
Есть простой UDP клиент и UDP эхо-сервер. Вот исходники: Сервер: #include &quot;stdafx.h&quot;...

UDP-сервер/клиент на Winsock
Доброго времени суток Есть UDP сервер и клиент, реализованные средствами winsock. Пока что все...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru