|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.02.2016, 00:03 | #1 |
Новичок
Джуниор
Регистрация: 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); } |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |