Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
BlackOwl
5 / 5 / 1
Регистрация: 23.12.2014
Сообщений: 90
#1

RAW сокет - C++

18.04.2015, 13:29. Просмотров 505. Ответов 4
Метки нет (Все метки)

нужен рабочий пример создания сырого сокета
З.ы под windows

Добавлено через 20 минут
нашел такой код, под хрюшей работает збс, но в 7 неработает, как можно это исправить? и можно ли это исправить вообще?
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <Winsock2.h>//Ws2_32.lib
#include <ws2tcpip.h>
//#include <Windows.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
/*****************************************************************/
void ShowError()
{
        LPVOID lpMsgBuf = NULL;
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,WSAGetLastError(),
                MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL);
        CharToOem((char*)lpMsgBuf,(char*)lpMsgBuf);
        cout<<(LPCTSTR)lpMsgBuf<<endl;
        LocalFree(lpMsgBuf);
}
 
USHORT checksum(USHORT *buffer, int size)
{
    unsigned long cksum=0;
    while (size > 1){
        cksum += *buffer++;
        size  -= sizeof(USHORT);
    }
    if (size){
        cksum += *(UCHAR*)buffer;
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);
    return (USHORT)(~cksum);
}
/*****************************************************************/
typedef struct ip_hdr
{
        unsigned char    ip_verlen;
        unsigned char    ip_tos;
        unsigned short   ip_total_len;
        unsigned short   ip_id;
        unsigned short   ip_offset;
        unsigned char    ip_ttl;
        unsigned char    ip_protocol;
        unsigned short   ip_checksum;
        unsigned int     sourceIP;
        unsigned int     destIP;
}IP_HDR;
 
typedef struct udp_hdr
{
        unsigned short   source_port;
        unsigned short   dest_port;
        unsigned short   udp_len;
        unsigned short   udp_sum;
}UDP_HDR;
 
/*****************************************************************/
 
int main()
{
        WSADATA            wsaData;
        struct sockaddr_in remote;
        IP_HDR                 ipHdr;
        UDP_HDR                udpHdr;
        unsigned short     iTotalSize,iIPSize,iUdpSize, iUdpChecksumSize,ver;
        char                       buf[4096],*ptr,szMessage[4068];
        strcpy(szMessage,"Code by Lazy_elf");
 
 
        if(WSAStartup(0x0202,&wsaData)){ShowError();}
        else
        {
                cout<<"WSAStartup - OK"<<endl;
                SOCKET sckt;
                sckt = WSASocket (AF_INET,SOCK_RAW,IPPROTO_UDP,NULL,0,0);
                if(sckt == INVALID_SOCKET){ShowError();}
                {
                        cout<<"Raw scoket is created"<<endl;
 
                        BOOL opt = TRUE;
                        if(setsockopt (sckt,IPPROTO_IP,IP_HDRINCL,(char*)&opt,sizeof(opt))==SOCKET_ERROR)
                        {ShowError();}
                        else
                        {
                                cout<<"setsockopt - OK"<<endl;
                                iTotalSize = sizeof(ipHdr)+sizeof(udpHdr)+strlen(szMessage);
                                iIPSize    = sizeof(ipHdr)/sizeof(unsigned long);
                                ver = 4;
                                ipHdr.ip_verlen    = (ver<<4) | iIPSize;
                                ipHdr.ip_tos       = 0;
                                ipHdr.ip_total_len = htons(iTotalSize);
                                ipHdr.ip_id        = 0;
                                ipHdr.ip_offset    = 0;
                                ipHdr.ip_ttl       = 128;
                                ipHdr.ip_protocol  = IPPROTO_UDP;
                                ipHdr.ip_checksum  = 0;
                                ipHdr.sourceIP     = inet_addr("127.0.0.1");
                                ipHdr.destIP       = inet_addr("127.0.0.1");
                                //-------------------------------------------//
                                iUdpSize = sizeof(udpHdr)+strlen(szMessage);
                                udpHdr.source_port = htons(3004);
                                udpHdr.dest_port   = htons(4004);
                                udpHdr.udp_len     = htons(iUdpSize);
                                udpHdr.udp_sum     = 0;
                                //-------------------------------------------//
                                iUdpChecksumSize = 0;
                                ptr = buf;ZeroMemory(buf,4096);
                                memcpy(ptr,&ipHdr.sourceIP, sizeof(ipHdr.sourceIP));
                                ptr              += sizeof(ipHdr.sourceIP);
                                iUdpChecksumSize += sizeof(ipHdr.sourceIP);
                                memcpy(ptr,&ipHdr.destIP,sizeof(ipHdr.destIP));
                                ptr              += sizeof(ipHdr.destIP);
                                iUdpChecksumSize += sizeof(ipHdr.destIP);
                                ptr++;iUdpChecksumSize += 1;
                            memcpy(ptr,&ipHdr.ip_protocol,sizeof(ipHdr.ip_protocol));
                                ptr              += sizeof(ipHdr.ip_protocol);
                                iUdpChecksumSize += sizeof(ipHdr.ip_protocol);
                                memcpy(ptr,&udpHdr.udp_len,sizeof(udpHdr.udp_len));
                                ptr              += sizeof(udpHdr.udp_len);
                                iUdpChecksumSize += sizeof(udpHdr.udp_len);
                        memcpy(ptr,&udpHdr,sizeof(udpHdr));
                                ptr              += sizeof(udpHdr);
                                iUdpChecksumSize += sizeof(udpHdr);
                                for(unsigned int i = 0; i < strlen(szMessage); i++, ptr++)
                                        *ptr = szMessage[i];
                                iUdpChecksumSize += strlen(szMessage);
                                udpHdr.udp_sum =  checksum((USHORT *)buf, iUdpChecksumSize);
 
                                ZeroMemory(buf,4096);ptr = buf;
 
                                memcpy(ptr,&ipHdr, sizeof(ipHdr)); ptr += sizeof(ipHdr);
                                memcpy(ptr,&udpHdr,sizeof(udpHdr));ptr += sizeof(udpHdr);
                                memcpy(ptr,szMessage,strlen(szMessage));
 
 
                                remote.sin_family      = AF_INET;
                                remote.sin_port        = htons(4004);
                                remote.sin_addr.s_addr = inet_addr("127.0.0.1");
                                if(sendto(sckt,buf,iTotalSize,0,(SOCKADDR *)&remote,sizeof(remote))==SOCKET_ERROR){ShowError();}
                                else{cout<<"sendto - OK"<<endl;}
                        }
 
                        if(closesocket(sckt)== SOCKET_ERROR){ShowError();}
                        else{cout<<"closesocket - OK"<<endl;}
                }
 
                if(WSACleanup()){ShowError();}
                else{cout<<"WSACleanup - OK"<<endl;}
        }
        system("pause");
        return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2015, 13:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос RAW сокет (C++):

Преобразование Raw-данных в AIFF - C++
Пытаюсь считать Raw дату, и сформировать из него AIFF файл с заголовком и датой. Тоже самое делал с WAV, получилось. Методы по сути брал...

Raw socket подмена ip адреса отправителя - C++ Builder
Задача такая надо отправить пакет с другим ip адресом отправителя. Подскажите как это сделать? Слышал что можно это сделать через Raw...

Авторизация, игра pw. Нужно получить Raw Stream - C++ Builder
Использую Синапс. Если снифать автаризацию то передается параметр xml version = &quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;Auth ProjectId=&quot;61&quot;...

Визуализация 16 битного raw файла: Нужен совет - C++ Builder
Всем привет! Нужен совет, кто как решал бы такую задачу: На входе есть монохромное изображение в виде raw файла - матрица из 2-х...

сокет в builder - C++ Builder
Здравствуйте! Влот учусь прогать на с++, наткнулся на готовый код в билдере http://devoid.com.ua/c-builder/cppbu...versocket.html , все...

Вопрос про сокет - C++ Builder
Здравствуйте, есть консольное приложение которое с помощь сокетов грузит картинку из интернета. Структура программы самая тривиальная ...

4
san92der
14 / 14 / 3
Регистрация: 27.10.2012
Сообщений: 109
21.04.2015, 23:55 #2
Ты бы хотя бы ошибки написал. Без этого тебе никто не скажет точно.
Хотя наверняка что-то с либами не так
0
BlackOwl
5 / 5 / 1
Регистрация: 23.12.2014
Сообщений: 90
22.04.2015, 16:51  [ТС] #3
san92der, ошибок как таковых нет, это связано с тем что поддержка в виндовс 7 сырых сокетов сильно урезана, они просто не создаются
0
san92der
14 / 14 / 3
Регистрация: 27.10.2012
Сообщений: 109
22.04.2015, 18:43 #4
Раз уж никто не отвечает, кроме меня, позволю себе написать то, в чем не особо уверен
В универе писал простейший пример клиента-сервера на сырых сокетах.
На семерке у себя все запускал и работало. Была только пара косяков с запуском примеров
на семерке и у меня и у одногруппников. В основном все решалось этой строкой:
C++
1
#pragma comment(lib, "ws2_32.lib");
Либа кажется эта, если память не изменяет. Но без dll-ок ничего не получалось.
1
BlackOwl
5 / 5 / 1
Регистрация: 23.12.2014
Сообщений: 90
24.04.2015, 11:46  [ТС] #5
san92der, и на этом спасибо
0
24.04.2015, 11:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2015, 11:46
Привет! Вот еще темы с ответами:

Как синхронизировать сокет - C++ Builder
Добрый день, всех с наступающим. Вопрос такой на сегодня, как синхронизировать TClientSocket, TServerSocket. Вот у меня имеются эти...

Ответ сервера (сокет) - C++ Builder
У меня есть чат с БД Table. Мне надо теперь сделать что бы, как только клиентзалогинился, сразу ему пишется какное-нить сообщение. как...

Передать файл через сокет - C++ Builder
как качественно огранизовать передачу файла через нонблокинг сокет серверу? помогите пжл с примером маленьким..

4 планки Apacer DDR3 по 4Gb/1333MHz от старой МВ сокет 775 могу ли я их использовать на сокет 2011 - Оперативная память
недавно решил перейти с LGA775 на LGA2011. Финансы урезаны поэтому пока приобрёл только процессор Intel Core i7 - 3820 oem, 3.60GHz/ 10 MB/...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru