![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Знатокам WinSock [D6, WinXP]
JR © (2004-11-27 11:55:00)Привет всем!
Сразу код:
var
adr:sockaddr_in;
i:integer;
HSock1:integer;
Buf:array[0..100] of byte;
begin
WSAStartup($101,dat);
HSock1:= Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
adr.sin_family := AF_INET;
adr.sin_port := htons(<port>);
adr.sin_addr.s_addr := inet_addr(<localaddress>);
i:=1;
setsockopt(HSock1, SOL_SOCKET, SO_REUSEADDR, @i, 1);
Bind(HSock1,adr,sizeof(adr));
repeat
i:=sizeof(Buf);
i:=recvfrom(HSock1,Buf,sizeof(Buf),0,adr,i);
Windows.Beep(1000,100);
until i<=0;
CloseSocket(HSock1);
end;
Нужно "сесть" на порт чата, и хватать все входящие пакеты. Дак вот, если приходит пакет широковещательный (адрес назначения например 255.255.255.255), то пакеты принимаются обеими программами, а если только на данный хост (<localaddress>),то только одной из программ, что не есть гуд.
Уважаемые мастера, так и должно быть или можно поправить??? Естесственно это будет не шпион, а полезная программа.
Verg (2004-11-29 23:13:00) [1]uses WinSock;
type
// IP header
PIPHeader = ^TIPHeader;
TIPHeader = packed record
verlen : byte; // версия и длина заголовка
tos : byte; // тип сервиса
length : word; // длина всего пакета
id : word; // Id
offset : word; // флаги и смещения
ttl : byte; // время жизни
protocol : byte; // протокол
xsum : word; // контрольная сумма
src : TInAddr; // IP-адрес отправителя
dst : TInAddr; // IP-адрес назначения
end;
http://www.freenet6.ru/Info/usmanov-01/index.htm
http://www.zeiss.net.ru/docs/technol/tcpip/tcp00.htm
JR (2004-11-29 08:05:00) [2]Спасибо! Разобрался, работает.
Не подскажите ли ещё, как описывается структура IPHeader(ver4)?
Verg (2004-11-28 13:42:00) [3]При связывании (bind & SO_REUSEADDR) сокета на один и тот же адрес и порт, направленную (адресную) датаграмму получит только один из этих сокетов.
"Поправить" это нельзя.
Придется написать простейший снифер на базе символьного сокета (SOCK_RAW), принимать все входящие IP датаграммы, и далее по заголовкам UDP пакетов брать только нужные пакеты.
JR (2004-11-27 23:35:00) [4]Запущен сторонний чат на UDP-Broadcast. Нужно хватать на этом же компе все входящие на его (чата) порт пакеты (ну сниффер значит своего рода). Дак вот, броадкаст пакеты "ловят" и чат и этот "сниффер", а upd-пакеты, посланные только на данный компьютер, ловят или сам чат или данный пример кода.
Прошу прощения, если опять непонятно... учусь.
Verg (2004-11-27 22:54:00) [5]
> то пакеты принимаются обеими программами, а если только
> на данный хост (<localaddress>),то только одной из программ,
> что не есть гуд.
А не понятно поричем тут "обеи программы", при чем удивление по поводу приема адресованных датаграмм?
Они же направлены конкретному адресату. И что бы эжто была за такая сеть, и зачем бы были вообще придуманы адреса, если бы их принимали бы все?
Тебе нужен снифер что ли?
Ты хочешь получить код снифера?
JR (2004-11-27 22:47:00) [6]А что молчите?
JR (2004-11-27 11:59:00) [7]Две программы - сторонний чат и эта программа.
Проверка на ошибки опущена для краткости
......................................