103 lines
2.7 KiB
C++
Executable File
103 lines
2.7 KiB
C++
Executable File
/*
|
|
** JNetLib
|
|
** Copyright (C) 2000-2001 Nullsoft, Inc.
|
|
** Author: Justin Frankel
|
|
** File: testbnc.cpp - JNL network bounce test code
|
|
** License: see jnetlib.h
|
|
*/
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#else
|
|
#define Sleep(x) usleep((x)*1000)
|
|
#endif
|
|
#include <stdio.h>
|
|
#include "jnetlib.h"
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
JNL_Connection *cons[32]={0,};
|
|
JNL_Connection *outcons[32]={0,};
|
|
int n_cons=0;
|
|
|
|
if (argc != 4 || !atoi(argv[1]) || !atoi(argv[3]) || !argv[2][0])
|
|
{
|
|
printf("usage: redir localport host remoteport\n");
|
|
exit(1);
|
|
}
|
|
|
|
JNL::open_socketlib();
|
|
JNL_AsyncDNS dns;
|
|
JNL_Listen l((short)atoi(argv[1]));
|
|
printf("running...\n");
|
|
while (!l.is_error())
|
|
{
|
|
Sleep(10);
|
|
if (n_cons<32)
|
|
{
|
|
JNL_Connection *con=l.get_connect();
|
|
if (con)
|
|
{
|
|
int x;
|
|
for (x = 0; x < 32; x ++)
|
|
{
|
|
if (!cons[x])
|
|
{
|
|
outcons[x]=new JNL_Connection();
|
|
outcons[x]->connect(argv[2],atoi(argv[3]));
|
|
cons[x]=con;
|
|
char host[256];
|
|
JNL::addr_to_ipstr(cons[x]->get_remote(),host,sizeof(host));
|
|
n_cons++;
|
|
printf("Connection %d (%s) opened (%d).\n",x,host,n_cons);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int x;
|
|
for (x = 0; x < 32; x ++)
|
|
{
|
|
if (cons[x])
|
|
{
|
|
cons[x]->run();
|
|
outcons[x]->run();
|
|
|
|
int cerr=(cons[x]->get_state() == JNL_Connection::STATE_ERROR || cons[x]->get_state()==JNL_Connection::STATE_CLOSED);
|
|
int oerr=(outcons[x]->get_state() == JNL_Connection::STATE_ERROR || outcons[x]->get_state()==JNL_Connection::STATE_CLOSED);
|
|
|
|
if ((!outcons[x]->send_bytes_in_queue() && !cons[x]->recv_bytes_available() && cerr) ||
|
|
(!cons[x]->send_bytes_in_queue() && !outcons[x]->recv_bytes_available() && oerr) ||
|
|
(cerr && oerr))
|
|
{
|
|
char host[256];
|
|
JNL::addr_to_ipstr(cons[x]->get_remote(),host,sizeof(host));
|
|
delete cons[x];
|
|
delete outcons[x];
|
|
outcons[x]=0;
|
|
cons[x]=0;
|
|
n_cons--;
|
|
printf("Connection %d (%s) closed (%d)\n",x,host,n_cons);
|
|
}
|
|
else
|
|
{
|
|
char buf[4096];
|
|
int l;
|
|
l=outcons[x]->send_bytes_available();
|
|
if (l > 4096) l=4096;
|
|
if (l) l=cons[x]->recv_bytes(buf,l);
|
|
if (l) outcons[x]->send(buf,l);
|
|
|
|
l=cons[x]->send_bytes_available();
|
|
if (l > 4096) l=4096;
|
|
if (l) l=outcons[x]->recv_bytes(buf,l);
|
|
if (l) cons[x]->send(buf,l);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
JNL::close_socketlib();
|
|
return 0;
|
|
}
|