Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Сырые сокеты в WinXP

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Avatar



Зарегистрирован: 29.12.2003
Сообщения: 4

СообщениеДобавлено: Пн Дек 29 2003 13:11    Заголовок сообщения: Сырые сокеты в WinXP Ответить с цитатой

Добрый день, господа.
Необходимо из под WinXP программно формировать, отправлять и получать tcp-пакеты. Пробовал сделать по примеру как это делается в *nix - системах, но, понятно, ничего не вышло. Очень буду признателен, если кто-нибудь подкинет статейку или какой-нибудь сорец..... Очень нужно разобраться....
И ещё один вопросик: при попытке установить опции на сырой сокет с параметром IP_HDRINCL, борланд си 6-ой сказал, что он вообще не знает, что это такое, хотя в MSDN этот макрос описывается.... В хиадерах включена winsock2.h.... В чём может быть дело?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
совсем незнакомый



Зарегистрирован: 24.12.2003
Сообщения: 183
Откуда: Israel

СообщениеДобавлено: Пн Дек 29 2003 15:01    Заголовок сообщения: Ответить с цитатой

если МСДН говорит это макро - то я бы посмотрел микрософтовые системы разработки. (т.е. вижуал студио)
там есть 2 версии виндовых сокетов - 1 н 2.
там же есть и сорцы для примеров.
стоит также использовать виндосовые методы и функции
[не только лиссен(), байнд(), сокет(), селект() и т.д.]
только стоит прочитать всю доку потому,
что есть несколько серьёзных различий
с Б.С.Д-вскими сокетами [орношение к параметрам, и резултаты вызовов различны]

удачи вам.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Avatar



Зарегистрирован: 29.12.2003
Сообщения: 4

СообщениеДобавлено: Пн Дек 29 2003 15:36    Заголовок сообщения: Ответить с цитатой

Это всё понятно, но в том-то и дело, что я никаких исходников там и не нашёл. Что касается простых сокетов, то работа с ними пока проблем не вызывала, с проблемой столкнулся именно при работе с сырыми сокетами под WinXP.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
совсем незнакомый



Зарегистрирован: 24.12.2003
Сообщения: 183
Откуда: Israel

СообщениеДобавлено: Пн Дек 29 2003 17:25    Заголовок сообщения: Ответить с цитатой

я не знаю чего там непонятно, но неплохая ссылка здесь.

прошу обратить внимание:
Note Raw socket support requires administrative privileges. Users running Winsock applications that make use of raw sockets must have administrative privileges on the computer, otherwise raw socket calls will fail with an error code of WSAEACCES.

короче. борланд - не знаю. а В.С. дотНет - всё намано.
надо только добавить вашего юзера в администраторы.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Avatar



Зарегистрирован: 29.12.2003
Сообщения: 4

СообщениеДобавлено: Ср Дек 31 2003 13:51    Заголовок сообщения: Ответить с цитатой

Я на домашнй комп всегда вхожу под админом.

А чего непонятно, так вот например:


#include <vcl.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>


#pragma hdrstop
#pragma pack(1)

#define WIN32_LEAN_AND_MEAN

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define MAX_MESSAGE 4068
#define MAX_PACKET 4096

#define DEFAULT_MESSAGE "This is a test"

struct tcpheader
{
unsigned short int th_sport;
unsigned short int th_dport;
unsigned int th_seq;
unsigned int th_ack;
unsigned char th_x2:4, th_off:4;
unsigned char th_flags;
unsigned short int th_win;
unsigned short int th_sum;
unsigned short int th_urp;

unsigned char identity [4];
unsigned char data [200];
} ; /* total tcp header length: 20 bytes (=160 bits) */

struct ipheader {
unsigned char ip_hl:4, ip_v:4; /* this means that each member is 4 bits */
unsigned char ip_tos;
unsigned short int ip_len;
unsigned short int ip_id;
unsigned short int ip_off;
unsigned char ip_ttl;
unsigned char ip_p;
unsigned short int ip_sum;
unsigned int ip_src;
unsigned int ip_dst;
}; /* total ip header length: 20 bytes (=160 bits) */


typedef struct ps_hdr
{
unsigned int source_address; // Source Address => 4 Bytes
unsigned int dest_address; // Destination Address => 4 Bytes
unsigned char placeholder; // Place Holder => 1 Bytes
unsigned char protocol; // Protocol => 1 Bytes
unsigned short tcp_length; // TCP Length => + 2 Bytes
// = 12 Bytes
struct tcpheader tcp;

}PS_HDR;


char strMessage[MAX_MESSAGE]; // Message to send
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

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);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
WSADATA wsd;
SOCKET s;
DWORD i;
char *datagram="", ident[] = "ScMX";
hostent *h = NULL;
int bOpt = 1, y, len;
char RecvBuf[200];

struct ipheader *iph = (struct ipheader *) malloc(sizeof(struct ipheader));
struct tcpheader *tcph = (struct tcpheader *) malloc( sizeof (struct tcpheader));
struct ps_hdr *ps = (struct ps_hdr *) malloc( sizeof (struct ps_hdr));
datagram = (char *) malloc(sizeof(struct ipheader) + sizeof(struct tcpheader));
struct sockaddr_in sin, dest;


if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
ShowMessage("WSAStartup() failed: " + IntToStr(GetLastError()));
return;
}

s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0,0);
if (s == INVALID_SOCKET)
{
ShowMessage("WSASocket failed: " + IntToStr(GetLastError()));
return;
}


iph= (struct ipheader *) datagram;
tcph=(struct tcpheader *) (datagram+ sizeof(struct ipheader));

sin.sin_family = AF_INET;
sin.sin_port = htons (110);
h = gethostbyname("localhost");
if(h == NULL)
ShowMessage("╬°шсър gethostbyname");

sin.sin_addr.s_addr = inet_addr (inet_ntoa(*((struct in_addr *)h->h_addr)));

iph->ip_hl = 5;
iph->ip_v = 4;
iph->ip_tos = 0;
iph->ip_len = sizeof (struct ipheader) + sizeof (struct tcpheader);

iph->ip_id = 1;
iph->ip_off = 0;
iph->ip_ttl = 255;
iph->ip_p = IPPROTO_TCP;
iph->ip_sum = 0;
iph->ip_src = inet_addr ("127.0.0.1");
iph->ip_dst = sin.sin_addr.s_addr;

tcph->th_sport = htons (1999);
tcph->th_dport = htons (135);
tcph->th_seq = 666;
tcph->th_ack = htons (6234);
tcph->th_x2 = 0;
tcph->th_off = 5;
tcph->th_flags = 16; // SYN
tcph->th_win = htons(65535);
tcph->th_sum = 0;
tcph->th_urp = 0;

strncpy((char *)tcph->identity,ident,4);

for(i = 0; i < strlen(strMessage); i++)
tcph->data[i]=strMessage[i];

ps->source_address = inet_addr ("127.0.0.1");
ps->dest_address = sin.sin_addr.s_addr;
ps->placeholder = 0;
ps->protocol = IPPROTO_TCP;
ps->tcp_length = htons(sizeof(struct tcpheader));

ps->tcp = *tcph;

tcph->th_sum = checksum((unsigned short *)ps, sizeof(struct ps_hdr));
iph->ip_sum = checksum((unsigned short *)iph, sizeof(struct ipheader));

setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt));

if (sendto(s, datagram, iph->ip_len, 0, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
{
ShowMessage("sendto() failed: " + IntToStr(WSAGetLastError()));
return;
}

memset(datagram,0,strlen(datagram));

i = 0;
len = sizeof(sin);

i = recvfrom(s, RecvBuf, 200, 0,(sockaddr*)&sin, &len);
if(i > 0)
RichEdit1->Lines->Add("╧юыєўхэ яръхЄ.");
/*while(i < 1)
{
memset(RecvBuf, 0, sizeof(RecvBuf));
i = recv(s, RecvBuf, 200, 0);
}
RichEdit1->Lines->Add("╧юыєўхэ яръхЄ."); */

closesocket(s) ;
WSACleanup() ;
}
//---------------------------------------------------------------------------

Никак не могу понять почему в ответ не приходит вообще никакого пакета (recivefrom), когда, по идее, должен прийти пакет с флагом ask.
Очень буду признателе за помощь.
Цель: получить tcp - пакет от удалённой машины, дабы в дальнейшем из tcp-заголовка достать размер окна....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
совсем незнакомый



Зарегистрирован: 24.12.2003
Сообщения: 183
Откуда: Israel

СообщениеДобавлено: Пн Янв 05 2004 11:51    Заголовок сообщения: Ответить с цитатой

не сильно вдаваясь в подробности вашего кода:
1. удалённый порт - 135.

2. ваш локальный адрес: 127.0.0.1
не знаю как он будет в виндах выходить наружу.
насколько мне известно - нужен нормальный адрес
[10.х.х.х или другое]

на удалённом компе может стоит:

1. Firewall.
2. NetBIOS сервис на TCP
3. inetd [services for unix]
4. etc.

которые перхватывают пакеты и перерабатывают их не так как вам хочется.

пpослушайте снифером вашу сетку
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Avatar



Зарегистрирован: 29.12.2003
Сообщения: 4

СообщениеДобавлено: Пн Янв 05 2004 13:30    Заголовок сообщения: Ответить с цитатой

Удалённый порт - любой открытый tcp-порт, дабы можно было получить пакет при хендшейке. 127,0,0,1 - потому, что дома тестирую прогу, а ip сменить не проблема. На компе никакого фаера не стоит и 135 порт доступен для коннекта.
На сегодняшний день мне удалось окольными путями решить эту проблему за счёт переведения сокета в прослушивающее состояние, т.е. он принимает все пакеты. Использовал WSAIoctl. Каким образом можно, используя WSAIoctl, получать на сокет только те пакеты, которые пришли с интересующей системы, а не анализировать весь трафик, дабы отобрать нужные пакеты?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
совсем незнакомый



Зарегистрирован: 24.12.2003
Сообщения: 183
Откуда: Israel

СообщениеДобавлено: Вт Янв 06 2004 16:56    Заголовок сообщения: Ответить с цитатой

Error Message:
Protocol not supported.

Explanation:
The protocol has not been configured on the system, or no implementation for it exists. For example, if a Winsock implementation does not support SOCK_RAW with IPPROTO_IP (or any other protocol), then the socket() call would fail with WSAEPROTONOSUPPORT. (However, if it does not support SOCK_RAW at all, you should expect WSAESOCKTNOSUPPORT). An incompatible protocol has been selected for establishing the connection.

User Action:
Developer suggestion: If you are trying to use an optional feature, handle the request as a non-fatal error (if possible), since some Winsock calls can legally fail the request.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...