![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 11.02.2016
Сообщений: 1
|
![]()
Вот возникла проблема не могу понять почему сервер принимает пакеты если клиент указывает неверный порт получателя 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 |