Чат Vypress

Є така програма. Працює за протоколом UDP. Широкомовлення - broadcast. UDP порт – 8167.

Хочу написати програму, яка прийматиме і надсилатиме повідомлення користувачам, які працюють з цією програмою.

Використовую компонент TNMUDP1. Властивості LocalPort: = 8167; RemotePort: = 8167; RemoteHost:= . Запускаю програму, але моя програма нічого не приймає і не вдається передати жодних даних VypressChat.

Ніхто не пробував вирішити таке ж завдання?

VuDZ (2002-01-31 15:30) [1]

а ти ео з ніффером спочатку, а потім вже пиши щось своє :)

Андре (2002-01-31 15:37) [2]

Може ще посиланням допоможете. Бажано безкоштовно.

Kornet (2002-01-31 17:02) [3]

Андре (2002-02-04 15:46) [4]

Щодо того, що читати чужі повідомлення некрасиво – цілком згоден, але що вдієш, якщо начальник вимагає. (Я краще попереджу про це кого потрібно :-)). Тепер сутнісно. При наведених вище налаштуваннях я перехоплюю всі повідомлення, але у перших вони всі однакові довжини, а по друге це не мої повідомлення - це якась тарабарщина. Дані я приймаю так:

procedure TForm1.NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); var MyStream: TMemoryStream; TmpStr: String; begin MyStream := TMemoryStream.Create; try NMUDP1.ReadStream(MyStream); SetLength(TmpStr,NumberBytes); MyStream.Read(TmpStr[1],NumberBytes); Memo1.Lines.Add(FromIP+": "+TmpStr); finally MyStream.Free; end; end;

В чому справа ? Це при передачі повідомлення так розбивається на пакети або це чат кодує дані ?

Ghostbuster (2002-02-05 09:51) [5]

Ні, дані не кодуються. Просто ти їх не можеш відобразити на memo, т.к. у буфері містяться нульові байти. Спробуй замінити їх на прогалини.

Kornet (2002-02-05 10:37) [6]

Там формат повідомлення типу: тип, складається з одного байта від кого, кому, параметри, параметри, . ознакою роздільника служить символ #0, тому як і сказав Ghostbuster у мемо залишок рядка просто не відображається.

tell (2002-02-09 13:51) [7]

for Андре: Якщо не шкода пожили вихідниками твоєї проги, у нас теж локалка на цьому чаті, тема мене зацікавила спробую теж щось придумати

nick_vstu (2002-02-10 00:48) [8]

і мені, будь ласка, якщо можна :)

[email protected] (2002-02-10 23:01) [9]

У мене вихідники є і того, й іншого, якщо що пиши на мило! місяць тому мною була примоцька написана, вона все це й робить.

cypher (2002-02-11 12:04) [10]

192.168.0.255 - не зовсім вірно краще 255.255.255.255 струм нетмастерівські ЮДП не розуміє такий бродкаст, або використовуй іншу компоненту, або став пральний бродкаст своєї мережі..

Я написав прогу для знущання з вайпресу, де мона і від будь-якого ніка слати соо, і трафік вона зніферить, читаючи всі привати. правда вона у мене під лінукс, ну і на гну С написана

lun (2002-02-12 01:23) [11]

cypher (2002-02-16 16:06) [12]

> Може в наступних версіях це реалізовано, що дуже важко віритися.

вірно практикою, зі свого IP не надіслати соо підчужим ніком

Ігор Ніколаєв (2002-02-17 11:52) [13]

Я бачу, ви тут дуже страждаєте. Краще скачайте ніфер для Vypress на яздрі Winpcap. Каскати на www.sources.ru розділ Паскаль\мережа

cypher (2002-02-17 17:14) [14]

нах, я сніф під Вайпрес вже більше року тому написав, досі ним користуюсь =)

Андре (2002-02-18 12:45) [15]

Може таки хтось допоможе? На одній машині запускаю чат, на другій свою програму:

procedure TForm1.NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); var MyStream: TMemoryStream; TmpStr: String; Bee: array [1..1000] of Char; rtt,Ic,Inick,Inickis,ism: Integer; Nick,nickis,sot,mess:string; i: integer; dc: Char; s: string; begin NMUDP1.ReadBuffer(Bee, Ic); s:=""; for i:=1 to 1000 do begin dc:=Bee[i]; if dc<#0 then s:=s+dc; Label4.Caption:=s; end; Memo2.Lines.Add(s); Memo2.Lines.SaveToFile("d:qwer"); end;

Посилав "1234567890" з машини на ту ж машину (просто для зручності, хоча пробував і з однієї на іншу). Ну ні в отриманому файлі такого рядка, принаймні я не бачу.

Може хтось знає в чому справа?

cypher (2002-02-18 18:02) [16]

Перевір, чи точно ти отримуєш у Bee дані. а далі че-нити придумаємо

cypher (2002-02-18 18:07) [17]

Ось шматок із мого сніфера, що обробляє скапчерний пакет. на С

void my_callback(u_char *user, const struct pcap_pkthdr *h, const u_char *p)< // *p - pointer to captured buffer struct udphdr *uh; struct ip *ih; struct ether_header *eh; u_shortспорт, дпорт, улен; статичний символ buf1[4000]; static char ipFrom[20]; static char ipTo[20]; u_char *n1,*n2,*msg;

// ETHER HEADER eh=(struct ether_header*)p; p += sizeof(struct ether_header); // IP-ЗАГОЛОВОК ih=(struct ip*)p; p+=sizeof(struct ip); // UDP HEADER uh=(struct udphdr*)p; p+=sizeof(struct udphdr); // UDP PARAM sport = ntohs(uh->uh_sport); // Порт джерела dport = ntohs(uh->uh_dport); // Порт призначення ulen = ntohs(uh->uh_ulen);

// ПЕРЕВІРИТИ ПЕРШІ ДЕСЯТЬ БАЙТІВ З ПОПЕРЕДНІМ ПАКЕТОМ if (!CompareWithPrev(p)) < n1=p+11; // НІКНЕЙМ src n2=n1+strlen(n1)+1; // НІКНЕЙМ dst msg=n2+strlen(n2)+1; // ТЕКСТ fprintf(stderr,"========================================= ===============$ sprintf(buf1,"[%s] ---%s:%s",time_get(),n1,n2,ipFrom,ipTo) ;

cypher ( 2002-02-18 18:15 ) [18]

if (!CompareWithPrev(p)) - перевіряє перші 10 байт буфера. вони заповнюються випадковим чином відправником, і якщо вони такі ж, як і в попередньому пакеті, то чат вважає це спамом і повідомлення ігнорує. взагалі формат соо приблизно такий:

vyp_packet = запис chk_packet : масив [1..10] символів; fin1 : байт; завжди #0 packet_type : char; // тип пакета (соо, загальний чат, привет, смена ника і пр) nickname_from:array [1.. _ ] of char; // ник (від кого) fin2 : char; // завжди #0 nickname_to:array[1.. _ ] of char; // ник кому. fin3 : символ; // всегда #0 msg : масив [1.. _ ] of char; кінець;

так як довжина ніків і повідомлення строго не зафіксована, то і розмір масиву точно не відомий =)