Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2016, 00:03   #1
Yandex&Google
Новичок
Джуниор
 
Регистрация: 11.02.2016
Сообщений: 1
По умолчанию Сервер принимает пакеты если клиент указывает неверный порт получателя UDP

Вот возникла проблема не могу понять почему сервер принимает пакеты если клиент указывает неверный порт получателя UDP. Кто то может пояснить почему так?
Сервер:
#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";
}
}

}

Клиент:
#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);
}
Yandex&Google вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP и SOCKS5 (udp пакеты) LITH PHP 1 14.07.2013 12:15
клиент и сервер на основе протокола UDP Шиншилка Помощь студентам 0 27.12.2012 13:47
UDP Клиент - сервер. Фильтрация IP на сервере Nikita_Serg C# (си шарп) 3 10.05.2012 11:52
UDP клиент-сервер. Пакет neon2k Общие вопросы .NET 1 27.06.2010 11:53
какой выбрать протокол, если есть сервер в интернете, и клиент должен передать ему команды anyx Работа с сетью в Delphi 3 25.09.2009 23:13