IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Читать из одного сокета и ложить результат чтения в другой...? (https://www.imho.ws/showthread.php?t=90476)

apoc 05.08.2005 16:20

Читать из одного сокета и ложить результат чтения в другой...?
 
Читать из одного сокета и ложить результат чтения в другой...?
Может кто делал нечто похожее... принцип: практически работа как прокси...

Asgard 06.08.2005 00:00

Принцип такой: открываешь один соккет, записываешь реультаты его ответа в переменную, коннектишься к другому сокету и пишешь в него то, что у тебя в переменной. Вот пример на 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;


apoc 07.08.2005 01:20

Класно! :) спасибо! буду знать как это делать на перлах, тем более что и на них мне тоже надо такое же сделать...
Но я не сказал в чем мне нужно, мне бы как сделать это же, но в Дельфях или в Си? Проблема в том что получая ответ от второго сокета, который я хочу отдать первому, первый уже не хочет получать... сам незнаю, логично, но как обойти не пойму... примерчик бы.
Пасибки!

PSyton 08.08.2005 20:50

Вот примерно то, 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);


apoc 09.08.2005 09:33

Спасибо, сижу разбираюсь, нашел еще пример и в Делфях... короче думаю все решу :) Спасибо


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

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