| imho.ws |
![]() |
|
|
|||||||
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
|
|
# 1 |
|
Junior Member
Регистрация: 17.08.2003
Адрес: Украина
Сообщения: 150
![]() ![]() ![]() ![]() |
Читать из одного сокета и ложить результат чтения в другой...?
Читать из одного сокета и ложить результат чтения в другой...?
Может кто делал нечто похожее... принцип: практически работа как прокси...
__________________
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. |
|
|
|
|
# 2 |
|
Member
Регистрация: 19.10.2004
Сообщения: 394
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Принцип такой: открываешь один соккет, записываешь реультаты его ответа в переменную, коннектишься к другому сокету и пишешь в него то, что у тебя в переменной. Вот пример на 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;
|
|
|
|
|
# 3 |
|
Junior Member
Регистрация: 17.08.2003
Адрес: Украина
Сообщения: 150
![]() ![]() ![]() ![]() |
Класно!
спасибо! буду знать как это делать на перлах, тем более что и на них мне тоже надо такое же сделать...Но я не сказал в чем мне нужно, мне бы как сделать это же, но в Дельфях или в Си? Проблема в том что получая ответ от второго сокета, который я хочу отдать первому, первый уже не хочет получать... сам незнаю, логично, но как обойти не пойму... примерчик бы. Пасибки!
__________________
His name is spelled A-P-O-C, with a C - not APOK, because it originates from the word 'apocalypse'... |
|
|
|
|
# 4 |
|
Junior Member
Регистрация: 19.04.2002
Адрес: Дом
Пол: Male
Сообщения: 187
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Вот примерно то, 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);
__________________
Дураки не динозавры - они не вымрут... |
|
|