Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.06;
Скачать: CL | DM;

Вниз

Глюки с IP адресом   Найти похожие ветки 

 
[SHS]MAD   (2003-08-08 11:34) [0]

Проблема такая. На Дельфи я в основном писал локальные приложения, а сетевые проги предпочитал на Perl. Так вот какой вопрос: если чел сидит в инете ч/з проксю или лань, то в перле были 2 замечательные переменные REMOTE_ADDR и HTTP_X_FORVARDED_FOR. Одна отвечала за адрес до прокси/лани, другая - за то, что там дальше. А в сокетах только RemoteAdres - это как REMOTE_ADDR. Не подскажите как определить второй адрес (как HTTP_X_FORVARDED_FOR)??? Очень нужно!!!


 
Digitman ©   (2003-08-08 12:28) [1]


> Не подскажите как определить второй адрес


ну, предположим, ты его определил
192.168.0.1

таких адресов хостов в локальных подсетях глоб.сети - миллионы !

и что тебе это дало в результате ?


 
[SHS]MAD   (2003-08-08 12:33) [2]

2 Digitman:
Если несколько челов сидят за проксей, то на мой взгляд - это единственный способ их идентификации.


 
Reindeer Moss Eater ©   (2003-08-08 12:45) [3]

Если несколько челов сидят за проксей, то на мой взгляд - это единственный способ их идентификации.

Это так.
Только это и так делается. И без дополнительных услилий с твоей стороны.


 
Digitman ©   (2003-08-08 12:50) [4]


> единственный способ их идентификации


идентификации на предмет ?


 
[SHS]MAD   (2003-08-08 12:57) [5]

2 Reindeer Moss Eater:
а как (сорцы, плиз)

2 Digiman:
Представь, к серверу подсоединились несколько клиентов, причем допустим 3 из них ч/з проксю. И вот серверу нужно узнать какому компу за проксей отослать ответ. Для этого я на перле всегда использовал связку этих 2 переменных. А тут не знаю как быть. И еще, у тебя Yahoo messenger есть?


 
Reindeer Moss Eater ©   (2003-08-08 12:59) [6]

Представь, к серверу подсоединились несколько клиентов, причем допустим 3 из них ч/з проксю. И вот серверу нужно узнать какому компу за проксей отослать ответ. Для этого я на перле всегда использовал связку этих 2 переменных. А тут не знаю как быть. И еще, у тебя Yahoo messenger есть?

Ну и что? Это не твоя забота разруливать сессии клиентов.


 
[SHS]MAD ©   (2003-08-08 13:01) [7]

2 Reindeer Moss Eater:
а если я этот сервер сам и пишу? и мне нужно знать конкретного клиента для чего-нибудь. А у тебя Yahoo messenger есть?


 
Digitman ©   (2003-08-08 13:08) [8]


> [SHS]MAD


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

procedure ServerSocketIncomingDataAvailable(Sender: TObject; Socket: TCustomWinSocket);
begin
// чтение данных запроса
// обработка запроса, формирования результата
Socket.SendStream(..); // ответ клиенту, приславшему запрос
end;

и где ты видишь, что хоть где-либо здесь явно фигурировала IP-идентификация клиента, с которым ведется обмен инф-цией в дан.момент ?


 
Polevi ©   (2003-08-08 13:08) [9]

работай в блокирующем режиме, в качестве сессии будет выступать транспортный поток


 
Reindeer Moss Eater ©   (2003-08-08 13:13) [10]

2 Reindeer Moss Eater:
а если я этот сервер сам и пишу? и мне нужно знать конкретного клиента для чего-нибудь.

Ну и знай наздоровье. Локальный IP для этого не нужен.
У меня их например 10. И что дальше?



 
[SHS]MAD ©   (2003-08-08 13:14) [11]

Хорошо, упростим постановку задачи. Предположим есть 3 клента и 1 сервер. Все клиенты подключились. 1й клиент со своим ником послал мессагу на сервер. Сервер прочел инфу, что сообщение 3му нику, который сидит (мы знаем, сервер нет) на 3м кленте. Как сервер узнает, что нужно именно 3му клиенту отправить это сообщение, а не 2му. Я бы тогда сделал соответствие - ник<->IP. Или как? Короче решил замутить свой аналог ICQ... ХЕЛП!!!


 
Reindeer Moss Eater ©   (2003-08-08 13:18) [12]

1.
Свяжи с каждой сессией структуру данных.
Храни в ней ник.
Перебирай сессии на предмет поиска ника.

2.
Это "дела" уровня приложения. Я с одним ником могу зайти со ста IP


 
panov ©   (2003-08-08 13:26) [13]

В событии OnConnect есть параметр - Socket.

Сохраняй его для последующего использования. Нужен тебе именно Socket: TCustomWinSocket. он однозначно идентифицирует подключившегося клиента.


 
Fredericco ©   (2003-08-08 13:32) [14]

Или сохраняй Socket.Handle
Потом обращайся
for i:=0 to ServerSocket.ActiveConnections-1 do
if ServerSocket.Connection[i].Socket.Handle=YourHandle then
ServerSocket.Connection[i].Socket <--


 
[SHS]MAD ©   (2003-08-08 13:40) [15]

2 Reindeer Moss Eater:
допустим свяжу я сессию и БД, но потом нужно отсылать сообщения клиенту, причем я хочу чтобы не клиент запрашивал новые сообщения, а именно сервер кидал их ему ТОЛЬКО ТОГДА, когда поступило новое сообщение (чтоб зря трафик не есть). И я немного смутно представляю всё это дело, блин, вот что значит перл... Может как-нибудь через совет Fredericco?


 
Reindeer Moss Eater ©   (2003-08-08 14:01) [16]

>SHS]MAD © (08.08.03 13:40)

Сначала задайся вопросом: Каким образом приконнектившийся клиент №1 сообщит серверу, что шлет сообщение для клиента №2


 
panov ©   (2003-08-08 14:10) [17]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;

type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
SockList: TList;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
SockList := TList.Create;
ServerSocket1.Port := 5000;
ServerSocket1.Open;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SockList.Free;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.Data := pointer(SockList.Add(Socket));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Sock: TCustomWinSocket;
begin
if SockList.Count=0 then
begin
ShowMessage("No active connections!");
Exit;
end;
for i := 0 to SockList.Count-1 do
begin
Sock := SockList[i];
if Integer(Sock.Data)=1 then
begin
Sock.SendText("Socket N "+IntToStr(i));
Exit;
end;
end;
ShowMessage("Socket not found!");
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i: Integer;
Sock: TCustomWinSocket;
begin
for i := 0 to SockList.Count-1 do
begin
Sock := SockList[i];
if Sock=Socket then
begin
SockList.Delete(i);
Exit;
( "Disconnect:Socket not found!")
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;

type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
SockList: TList;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
SockList := TList.Create;
ServerSocket1.Port := 5000;
ServerSocket1.Open;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SockList.Free;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.Data := pointer(SockList.Add(Socket));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Sock: TCustomWinSocket;
begin
if SockList.Count=0 then
begin
ShowMessage("No active connections!");
Exit;
end;
for i := 0 to SockList.Count-1 do
begin
Sock := SockList[i];
if Integer(Sock.Data)=1 then
begin
Sock.SendText("Socket N "+IntToStr(i));
Exit;
end;
end;
ShowMessage("Socket not found!");
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i: Integer;
Sock: TCustomWinSocket;
begin
for i := 0 to SockList.Count-1 do
begin
Sock := SockList[i];
if Sock=Socket then
begin
SockList.Delete(i);
Exit;
end;
end;
ShowMessage("Disconnect:Socket not found!");
end;

end.



 
[SHS]MAD ©   (2003-08-09 03:13) [18]

2 panov:
Спасибо большое, вроде работает, буду думать :)

2 Reindeer Moss Eater:

> Сначала задайся вопросом: Каким образом приконнектившийся
> клиент №1 сообщит серверу, что шлет сообщение для клиента
> №2

Элементароно, клиент №1 кидает на сервак строку, в которой есть ник собеседник. Поднатужившись, сервант выдирает этот ник из запроса. А вот дальше по идее сервант должен определить нужный сокет и плюнуть туда мессагу :)


 
Anatoly Podgoretsky ©   (2003-08-09 08:41) [19]

Тогда твой сервер становится клиентом и должен подсоединиться к сервкеру (клиенту).


 
Verg ©   (2003-08-09 11:46) [20]


> HTTP_X_FORVARDED_FOR.


Это ты получишь в теле http запроса (get/post/header), а REMOTE_ADDR - это определяется еще на транспортном уровне (в сокете). PHP оба этих значения получает из переменных окружения, которые в свою очередь передает ему web сервер.
Если же ты делаешь свой WEB сервер, то придется самому это все вытаскивать: одно из сокета, другое - из заголовка http запроса.


 
Reindeer Moss Eater ©   (2003-08-11 08:22) [21]

[SHS]MAD
Элементароно, клиент №1 кидает на сервак строку, в которой есть ник собеседник. Поднатужившись, сервант выдирает этот ник из запроса. А вот дальше по идее сервант должен определить нужный сокет и плюнуть туда мессагу :)

Читай Reindeer Moss Eater © (08.08.03 13:18)



Страницы: 1 вся ветка

Текущий архив: 2003.10.06;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
1-18431
alex25
2003-09-25 10:43
2003.10.06
Динамическое создание кнопок


14-18641
NeyroSpace
2003-09-17 01:11
2003.10.06
Как все это запомнить????!!!!


14-18544
Sheng
2003-09-16 23:03
2003.10.06
Вот умеют же делать люди!!!


14-18554
Программист
2003-09-19 01:09
2003.10.06
Программист


1-18362
LinOS
2003-09-23 08:13
2003.10.06
Popup по click на кнопке