imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 05.08.2005, 16:20     # 1
apoc
Junior Member
 
Аватар для apoc
 
Регистрация: 17.08.2003
Адрес: Украина
Сообщения: 150

apoc Реально крут(а)apoc Реально крут(а)apoc Реально крут(а)apoc Реально крут(а)
Читать из одного сокета и ложить результат чтения в другой...?

Читать из одного сокета и ложить результат чтения в другой...?
Может кто делал нечто похожее... принцип: практически работа как прокси...
__________________
His name is spelled A-P-O-C, with a C - not APOK, because it originates from the word 'apocalypse'...

Последний раз редактировалось apoc; 09.08.2005 в 09:34.
apoc вне форума  
Старый 06.08.2005, 00:00     # 2
Asgard
Member
 
Аватар для Asgard
 
Регистрация: 19.10.2004
Сообщения: 394

Asgard Популярный человек на этом форумеAsgard Популярный человек на этом форумеAsgard Популярный человек на этом форумеAsgard Популярный человек на этом форумеAsgard Популярный человек на этом форумеAsgard Популярный человек на этом форумеAsgard Популярный человек на этом форуме
Принцип такой: открываешь один соккет, записываешь реультаты его ответа в переменную, коннектишься к другому сокету и пишешь в него то, что у тебя в переменной. Вот пример на perl'e:
Код:
#/usr/bin/perl

use strict;
use socket;
use IO::Handle;

use constant HOST_FROM => gethostbyname('www.hostfrom.net');
use constant PORT_FROM => getservbyname('www-http', 'tcp');
use constant PROTOCOL => getprotobyname('tcp');

if(@ARGV < 2)
   die "Usage $0: <host> <port>"

my ($host_to, $port_to) = (gethostbyname($ARGV[0]), $ARGV[1]);
#подключаемся к первому сокету
socket(SOCK, AF_INET, SOCK_STREAM, PROTOCOL) or 
   die "can't create socket :(";
connect(SOCK, sockaddr_in(PORT_FROM, HOST_FROM)) or
   die "can't connect to remote socket";
SOCK->autoflush(1);
my $result = undef;

while(<SOCK>) { $result .= $_; }

# закрываем первый сокет, данные полученные из него
# хранятся в переменной $result
close SOCK;
#открываем новый сокет, в который мы будем записывать полученные
# ранее данные
socket(NEW_SOCK, AF_INET, SOCK_STREAM, PROTOCOL) or
   die "can't create second socket :(";
connect(NEW_SOCK, sockaddr_in($port_to, $host_to)) or 
   die"can't connect to second remote soccet :(";
# пишем данные в удалённый сокет
print NEW_SOCK $result;
#всё, дело сделано
close NEW_SOCK;
Asgard вне форума  
Старый 07.08.2005, 01:20     # 3
apoc
Junior Member
 
Аватар для apoc
 
Регистрация: 17.08.2003
Адрес: Украина
Сообщения: 150

apoc Реально крут(а)apoc Реально крут(а)apoc Реально крут(а)apoc Реально крут(а)
Класно! спасибо! буду знать как это делать на перлах, тем более что и на них мне тоже надо такое же сделать...
Но я не сказал в чем мне нужно, мне бы как сделать это же, но в Дельфях или в Си? Проблема в том что получая ответ от второго сокета, который я хочу отдать первому, первый уже не хочет получать... сам незнаю, логично, но как обойти не пойму... примерчик бы.
Пасибки!
__________________
His name is spelled A-P-O-C, with a C - not APOK, because it originates from the word 'apocalypse'...
apoc вне форума  
Старый 08.08.2005, 20:50     # 4
PSyton
Junior Member
 
Аватар для PSyton
 
Регистрация: 19.04.2002
Адрес: Дом
Пол: Male
Сообщения: 187

PSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форуме
Вот примерно то, yf C++ (API), если где-то я ошибся, то уж извиняйте - на вскидку все. Но основной принцип я думаю будет понятен. Передача синхронная.
Код:
....
WORD wVersionRequested;
WSADATA wsaData;
DWORD err;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
	exit(-1);
if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2) 
{ //If sock version lover than 2.2
	AfxMessageBox("Sock wersion lover than 2.2. Inspect your system!");
	WSACleanup();
	exit(-1);
}
...
SOCKET m_clsock1;
SOCKET m_clsock2;
m_clsock1=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //init socket
m_clsock2=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
if (m_clsock1==INVALID_SOCKET|| m_clsock2==INVALID_SOCKET) //Init error
{
	str.Format("Error at socket(): %ld\n", WSAGetLastError());
	AfxMessageBox(str);
	WSACleanup();
	exit(-1);
}

hostent* remoteHost;
unsigned int addr;
if (isalpha(host1[0]))
{
	remoteHost=gethostbyname(host1); //Get host info from name
}
else
{
	addr=inet_addr(host1);
	remoteHost=gethostbyaddr((char *)&addr, 4, AF_INET); //Get host info from IP
}
if (WSAGetLastError()!=0) //Something wrong
{
	if (WSAGetLastError()==11001)
		str="Host not found...";
	else
		str.Format("error#:%ld", WSAGetLastError());
	closesocket(m_clsock1);
	closesocket(m_clsock2);
	m_clsock1=INVALID_SOCKET;
	m_clsock2=INVALID_SOCKET;
	AfxMessageBox(str); //Inform user about it
	WSACleanup();
	exit(-1);
}

sockaddr_in clientService; 
//Fill necessary data
clientService.sin_family=AF_INET;
memcpy(&(clientService.sin_addr.s_addr),remoteHost->h_addr_list[0],4);
char *aaa=inet_ntoa(clientService.sin_addr);
clientService.sin_port=htons(3302);
//try to connect with filled data
DWORD zz=connect(m_clsock1,(SOCKADDR*)&clientService,sizeof(clientService));
if (zz==SOCKET_ERROR) //din't connected
{
	closesocket(m_clsock1);
	closesocket(m_clsock2);
	m_clsock1=INVALID_SOCKET;
	m_clsock2=INVALID_SOCKET;
	AfxMessageBox("Faild to connect!");
	WSACleanup();
	exit(-1);
}

if (isalpha(host2[0]))
{
	remoteHost=gethostbyname(host2); //Get host info from name
}
else
{
	addr=inet_addr(host2);
	remoteHost=gethostbyaddr((char *)&addr, 4, AF_INET); //Get host info from IP
}
if (WSAGetLastError()!=0) //Something wrong
{
	if (WSAGetLastError()==11001)
	str="Host not found...";
	else
		str.Format("error#:%ld", WSAGetLastError());
	closesocket(m_clsock1);
	closesocket(m_clsock2);
	m_clsock1=INVALID_SOCKET;
	m_clsock2=INVALID_SOCKET;
	AfxMessageBox(str); //Inform user about it
	WSACleanup();
	exit(-1);
}
memcpy(&(clientService.sin_addr.s_addr),remoteHost->h_addr_list[0],4);
char *aaa=inet_ntoa(clientService.sin_addr);
clientService.sin_port=htons(3302);
DWORD zz=connect(m_clsock1,(SOCKADDR*)&clientService,sizeof(clientService));
if (zz==SOCKET_ERROR) //din't connected
{
	closesocket(m_clsock1);
	closesocket(m_clsock2);
	m_clsock1=INVALID_SOCKET;
	m_clsock2=INVALID_SOCKET;
	WSACleanup();
	AfxMessageBox("Faild to connect!");
	exit(-1);
}
char rBuffer[1024];
long bytes_rcv;
//код пересылки
while ((bytes_rcv=recv(m_clsock1,rBuffer,1024,0))>0)
{
  if (send(m_clsock2,rBuffer,1024,0)<=0)
  {
	closesocket(m_clsock1);
	closesocket(m_clsock2);
	m_clsock1=INVALID_SOCKET;
	m_clsock2=INVALID_SOCKET;
	WSACleanup();
  	AfxMessage("Can't send data!!!");
	exit(-1);
  }
}
closesocket(m_clsock1);
closesocket(m_clsock2);
m_clsock1=INVALID_SOCKET;
m_clsock2=INVALID_SOCKET;
WSACleanup();
exit(0);
__________________
Дураки не динозавры - они не вымрут...
PSyton вне форума  
Старый 09.08.2005, 09:33     # 5
apoc
Junior Member
 
Аватар для apoc
 
Регистрация: 17.08.2003
Адрес: Украина
Сообщения: 150

apoc Реально крут(а)apoc Реально крут(а)apoc Реально крут(а)apoc Реально крут(а)
Спасибо, сижу разбираюсь, нашел еще пример и в Делфях... короче думаю все решу Спасибо
__________________
His name is spelled A-P-O-C, with a C - not APOK, because it originates from the word 'apocalypse'...
apoc вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 14:02.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.