} } }

    lcx - HTran 端口转发对象 c++ -> delphi

    添加时间:2013-5-4 点击量:

      1 
    
    2
    3
    4 HTran.cpp - HUC Packet Transmit Tool.
    5
    6 Copyright (C) 2000-2004 HUC All Rights Reserved.
    7
    8 Author : lion
    9 : lion#cnhonker.net
    10 : [url]http://www.cnhonker.com[/url]
    11 :
    12 Notice: Thx to bkbll (bkbll#cnhonker.net)
    13 :
    14 Date : 2003-10-20
    15 :
    16 Complie : cl HTran.cpp
    17 :
    18 Usage : E:\>HTran
    19 : ======================== HUC Packet Transmit Tool V1.00 =======================
    20 : =========== Code by lion & bkbll, Welcome to http://www.cnhonker.com ==========
    21 :
    22 : [Usage of Packet Transmit:]
    23 : HTran -<listen|tran|slave> <option> [-log logfile]
    24 :
    25 : [option:]
    26 : -listen <ConnectPort> <TransmitPort>
    27 : -tran <ConnectPort> <TransmitHost> <TransmitPort>
    28 : -slave <ConnectHost> <ConnectPort> <TransmitHost> <TransmitPort>
    29
    30
    31 Pascal version by adsj 2013.5.4
    32
    33
    34 unit LCXUnit;
    35
    36 interface
    37
    38 uses
    39 System.SysUtils, codesitelogging,
    40 Winapi.Windows,
    41 Winapi.Winsock2;
    42
    43 const
    44 VERSION = 0.01;
    45 TIMEOUT = 300;
    46 MAXSIZE = 20480;
    47 HOSTLEN = 40;
    48 CONNECTNUM = 5;
    49 // ERROR CODE
    50 EINTR = 4;
    51 ENOSPC = 28;
    52
    53 type
    54 pTransock = ^transock;
    55
    56 transock = record
    57 fd1: TSocket;
    58 fd2: TSocket;
    59 end;
    60
    61 //
    62 procedure ver();
    63
    64 procedure usage(prog: PAnsiChar);
    65
    66 procedure transmitdata(data: Pointer); stdcall;
    67
    68 procedure getctrlc(j: Integer);
    69
    70 procedure closeallfd();
    71
    72 procedure makelog(buffer: PAnsiChar; bflength: Integer);
    73
    74 procedure proxy(port: Integer);
    75
    76 procedure bind2bind(port1, port2: Integer);
    77
    78 procedure bind2conn(port1: Integer; host: PAnsiChar; port2: Integer);
    79
    80 procedure conn2conn(host1: PAnsiChar; port1: Integer; host2: PAnsiChar;
    81 port2: Integer);
    82
    83 function testfisvalue(str: PAnsiChar): Integer;
    84
    85 function create_socket(): Integer;
    86
    87 function create_server(sockfd: Integer; port: Integer): Integer;
    88
    89 function client_connect(sockfd: Integer; server: PAnsiChar;
    90 port: Integer): Integer;
    91
    92 //
    93 procedure __Main();
    94
    95 var
    96 error: Integer;
    97 method: Integer;
    98 connects: Integer;
    99
    100 implementation
    101
    102 procedure ver();
    103 begin
    104 Writeln(Format
    105==================================my lcx %s===================================
    106 [VERSION]));
    107 Writeln(=========== Code by lion & bkbll, Welcome to http://www.cnhonker.com ===========);
    108 end;
    109
    110 procedure usage(prog: PAnsiChar);
    111 begin
    112 // print some sth about this app
    113 Writeln([Usage of Packet Transmit:]);
    114 Writeln(Format( %s -<listen|tran|slave> <option> [-log logfile], [prog]));
    115 Writeln([option:]);
    116 Writeln( -listen <ConnectPort> <TransmitPort>);
    117 Writeln( -tran <ConnectPort> <TransmitHost> <TransmitPort>);
    118 Writeln( -slave <ConnectHost> <ConnectPort> <TransmitHost> <TransmitPort>);
    119 end;
    120
    121 procedure transmitdata(data: Pointer); stdcall;
    122 var
    123 fd1, fd2: TSocket;
    124 psock: pTransock;
    125 timeset: timeval;
    126 readfd, writefd: fd_set;
    127 ret, i: Integer;
    128 read_in1, send_out1: array [0 .. MAXSIZE - 1] of AnsiChar;
    129 read_in2, send_out2: array [0 .. MAXSIZE - 1] of AnsiChar;
    130 read1, totalread1, send1: Integer;
    131 read2, totalread2, send2: Integer;
    132 sendcount1, sendcount2: Integer;
    133 maxfd: Integer;
    134 client1, client2: sockaddr_in;
    135 structsize1, structsize2: Integer;
    136 host1, host2: array [0 .. 19] of AnsiChar;
    137 port1, port2: Integer;
    138 tmpbuf: array [0 .. 99] of AnsiChar;
    139 tbfstr: AnsiString;
    140 //
    141 err, err2: Integer;
    142 begin
    143 psock := pTransock(data);
    144 fd1 := psock^.fd1;
    145 fd2 := psock^.fd2;
    146
    147 FillChar(host1, 200);
    148 FillChar(host2, 200);
    149 FillChar(tmpbuf, 1000);
    150
    151 structsize1 := SizeOf(sockaddr);
    152 structsize2 := SizeOf(sockaddr);
    153
    154 if getpeername(fd1, sockaddr(client1), structsize1) < 0 then
    155 begin
    156 StrCopy(@host1[0], fd1);
    157 end
    158 else
    159 begin
    160 StrCopy(@host1[0], inet_ntoa(client1.sin_addr));
    161 port1 := ntohs(client1.sin_port);
    162 end;
    163
    164 if getpeername(fd2, sockaddr(client2), structsize2) < 0 then
    165 begin
    166 StrCopy(@host2[0], fd2);
    167 end
    168 else
    169 begin
    170 StrCopy(@host2, inet_ntoa(client2.sin_addr));
    171 port2 := ntohs(client2.sin_port);
    172 end;
    173
    174 // printf start transmit host1:port1 <-> host2:port2
    175 Writeln(Format([+] Start Transmit (%s:%d <-> %s:%d) ......
    176 [host1, port1, host2, port2]));
    177
    178 if fd1 > fd2 then
    179 maxfd := fd1 + 1
    180 else
    181 maxfd := fd2 + 1;
    182
    183 FillChar(read_in1, MAXSIZE, 0);
    184 FillChar(read_in2, MAXSIZE, 0);
    185 FillChar(send_out1, MAXSIZE, 0);
    186 FillChar(send_out2, MAXSIZE, 0);
    187
    188 timeset.tv_sec := TIMEOUT;
    189 timeset.tv_usec := 0;
    190
    191 while True do
    192 begin
    193 FD_ZERO(readfd);
    194 FD_ZERO(writefd);
    195
    196 _FD_SET(fd1, readfd);
    197 _FD_SET(fd1, writefd);
    198 _FD_SET(fd2, writefd);
    199 _FD_SET(fd2, readfd);
    200
    201 ret := (maxfd, @readfd, @writefd, nil, @timeset);
    202 if (ret < 0and (h_errno <> WSAEINTR) then
    203 begin
    204 // printf error
    205 Writeln([-] Select error.);
    206 Break;
    207 end
    208 else if ret = 0 then
    209 begin
    210 // printf socket time out
    211 Writeln([-] Socket time out.);
    212 Break;
    213 end;
    214
    215 if FD_ISSET(fd1, readfd) then
    216 begin
    217 //
    218 if totalread1 < MAXSIZE then
    219 begin
    220 read1 := recv(fd1, read_in1, MAXSIZE - totalread1, 0);
    221 if (read1 = SOCKET_ERROR) or (read1 = 0then
    222 begin
    223 // printf read fd1 data error,maybe close?
    224 Writeln([-] Read fd1 data error,maybe close?);
    225 Break;
    226 end;
    227
    228 CopyMemory(@send_out1[totalread1], @read_in1[0], read1);
    229 // sprintf(tmpbuf,\r\nRecv %5d bytes %s:%d\r\n, read1, host1, port1);
    230 tbfstr := Format( Recv %5d bytes %s:%d, [read1, host1, port1]);
    231 StrCopy(@tmpbuf, PAnsiChar(tbfstr));
    232 // recv read1 bytes host1:port1
    233 Writeln(Format( Recv %5d bytes %16s:%d, [read1, host1, port1]));
    234 totalread1 := totalread1 + read1;
    235 FillChar(read_in1, MAXSIZE, 0);
    236 end;
    237 end;
    238
    239 if FD_ISSET(fd2, writefd) then
    240 begin
    241 err := 0;
    242 sendcount1 := 0;
    243 while totalread1 > 0 do
    244 begin
    245 send1 := send(fd2, send_out1, totalread1, 0);
    246 if send1 = 0 then
    247 Break;
    248 if (send1 < 0and (h_errno <> EINTR) then
    249 begin
    250 // printf send to fd2 unknow error
    251 Writeln([-] Send to fd2 unknow error.);
    252 err := 1;
    253 Break;
    254 end;
    255
    256 if (send1 < 0and (h_errno = ENOSPC) then
    257 Break;
    258
    259 sendcount1 := sendcount1 + send1;
    260 totalread1 := totalread1 - send1;
    261
    262 // printf send send1 bytes host2 : port2
    263 Writeln(Format( Send %5d bytes %16s:%d, [send1, host2, port2]));
    264 end;
    265
    266 if err = 1 then
    267 Break;
    268
    269 if (totalread1 > 0and (sendcount1 > 0then
    270 begin
    271 // move not sended data to start addr
    272 CopyMemory(@send_out1, @send_out1[sendcount1], totalread1);
    273 FillChar(send_out1[totalread1], MAXSIZE - totalread1, 0);
    274 end
    275 else
    276 FillChar(send_out1, MAXSIZE, 0);
    277 end;
    278
    279 if FD_ISSET(fd2, readfd) then
    280 begin
    281 if totalread2 < MAXSIZE then
    282 begin
    283 read2 := recv(fd2, read_in2, MAXSIZE - totalread2, 0);
    284 if read2 = 0 then
    285 Break;
    286
    287 if (read2 < 0and (h_errno <> EINTR) then
    288 begin
    289 // Read fd2 data error,maybe close?
    290 Writeln([-] Read fd2 data error,maybe close?);
    291 Break;
    292 end;
    293 CopyMemory(@send_out2[totalread2], @read_in2, read2);
    294
    295 // Recv read2 bytes host2:port2
    296 tbfstr := Format(Recv %5d bytes %s:%d, [read2, host2, port2]);
    297 StrCopy(@tmpbuf, PAnsiChar(tbfstr));
    298 Writeln(Format( Recv %5d bytes %16s:%d, [read2, host2, port2]));
    299 // log
    300 //
    301 totalread2 := totalread2 + read2;
    302 FillChar(read_in2, MAXSIZE, 0);
    303 end;
    304 end;
    305
    306 if FD_ISSET(fd1, writefd) then
    307 begin
    308 err2 := 0;
    309 sendcount2 := 0;
    310 while totalread2 > 0 do
    311 begin
    312 send2 := send(fd1, send_out2[sendcount2], totalread2, 0);
    313 if send2 = 0 then
    314 Break;
    315 if (send2 < 0and (h_errno <> EINTR) then
    316 begin
    317 // send to fd1 unknow error.
    318 Writeln([-] Send to fd1 unknow error.);
    319 err2 := 1;
    320 Break;
    321 end;
    322 if (send2 < 0and (h_errno = ENOSPC) then
    323 Break;
    324 sendcount2 := sendcount2 + send2;
    325 totalread2 := totalread2 - send2;
    326 // Send send2 bytes host1:port1
    327 Writeln(Format( Send %5d bytes %16s:%d, [send2, host1, port1]));
    328 end;
    329
    330 if err2 = 1 then
    331 Break;
    332 if (totalread2 > 0and (sendcount2 > 0then
    333 begin
    334 CopyMemory(@send_out2, @send_out2[sendcount2], totalread2);
    335 FillChar(send_out2[totalread2], MAXSIZE - totalread2, 0);
    336 end
    337 else
    338 FillChar(send_out2, MAXSIZE, 0);
    339 end;
    340 Sleep(5);
    341 end;
    342
    343 closesocket(fd1);
    344 closesocket(fd2);
    345 //
    346 // ok i closed the two socket.
    347 Writeln([+] OK! I Closed The Two Socket.);
    348 end;
    349
    350 procedure getctrlc(j: Integer);
    351 begin
    352 // received ctrl + c
    353 Writeln([-] Received Ctrl+C);
    354 closeallfd();
    355 Exit;
    356 end;
    357
    358 procedure closeallfd();
    359 var
    360 i: Integer;
    361 begin
    362 // let me exit......
    363 Writeln([+] Let me exit ......);
    364 // fflush(stdout)
    365 for i := 3 to 255 do
    366 closesocket(i);
    367
    368 // if fp<> nil then
    369 // begin
    370 // print exit
    371 // fclose(fp)
    372 // end;
    373 // All Right
    374 Writeln([+] All Right!);
    375 end;
    376
    377 procedure makelog(buffer: PAnsiChar; bflength: Integer);
    378 begin
    379
    380 end;
    381
    382 procedure proxy(port: Integer);
    383 begin
    384
    385 end;
    386
    387 procedure bind2bind(port1, port2: Integer);
    388 var
    389 fd1, fd2, sockfd1, sockfd2: TSocket;
    390 client1, client2: sockaddr_in;
    391 size1, size2: Integer;
    392
    393 hThread: THandle;
    394 sock: transock;
    395 dwThreadID: DWORD;
    396 begin
    397 fd1 := create_socket();
    398 if (fd1) = 0 then
    399 Exit;
    400 fd2 := create_socket();
    401 if (fd2) = 0 then
    402 Exit;
    403 // printf listening port1
    404 Writeln(Format([+] Listen port %d!, [port1]));
    405 if create_server(fd1, port1) = 0 then
    406 begin
    407 closesocket(fd1);
    408 Exit;
    409 end;
    410
    411 // listen ok
    412 Writeln([+] Listen OK!);
    413 // printf listening port2
    414 Writeln(Format([+] Listening port %d ......, [port2]));
    415
    416 if create_server(fd2, port2) = 0 then
    417 begin
    418 closesocket(fd2);
    419 Exit;
    420 end;
    421
    422 // listen ok
    423 Writeln([+] Listen OK!);
    424
    425 size1 := SizeOf(sockaddr);
    426 size2 := SizeOf(sockaddr);
    427
    428 while True do
    429 begin
    430 // waiting for Client on port 1
    431 Writeln(Format([+] Waiting for Client on port:%d ......, [port1]));
    432
    433 sockfd1 := accept(fd1, @client1, @size1);
    434 if (sockfd1) < 0 then
    435 begin
    436 // accept error
    437 Writeln([-] Accept1 error.);
    438 Continue;
    439 end;
    440 // printf accept a Client on port1
    441 Writeln(Format([+] Accept a Client on port %d %s ......
    442 [port1, inet_ntoa(client1.sin_addr)]));
    443 // waiting another Client on port2
    444 Writeln(Format([+] Waiting another Client on port:%d...., [port2]));
    445
    446 sockfd2 := accept(fd2, @client2, @size2);
    447 if (sockfd2) < 0 then
    448 begin
    449 // accept2 error
    450 Writeln([-] Accept2 error.);
    451 closesocket(sockfd1);
    452 Continue;
    453 end;
    454 // printf accept a Client on port2 ..
    455 Writeln(Format([+] Accept a Client on port %d %s
    456 [port2, inet_ntoa(client2.sin_addr)]));
    457 // accept connect ok
    458 Writeln([+] Accept Connect OK!);
    459
    460 sock.fd1 := sockfd1;
    461 sock.fd2 := sockfd2;
    462
    463 hThread := CreateThread(nil0, @transmitdata, @sock, 0, dwThreadID);
    464 if hThread <= 0 then
    465 begin
    466 TerminateThread(hThread, 0);
    467 Exit;
    468 end;
    469 Sleep(1000);
    470 // printf CreateThread OK
    471 Writeln([+] CreateThread OK!);
    472 end;
    473 end;
    474
    475 procedure bind2conn(port1: Integer; host: PAnsiChar; port2: Integer);
    476 var
    477 sockfd, sockfd1, sockfd2: TSocket;
    478 remote: sockaddr_in;
    479 size: Integer;
    480 buffer: array [0 .. 1023] of AnsiChar;
    481 aStr: AnsiString;
    482 hThread: THandle;
    483 sock: transock;
    484 dwThreadID: DWORD;
    485 begin
    486 if (port1 < 1or (port1 > 65535then
    487 begin
    488 // ConnectPort invalid.
    489 Writeln([-] ConnectPort invalid.);
    490 Exit;
    491 end;
    492 if (port2 < 1or (port2 > 65535then
    493 begin
    494 // TransmitPort invalid.
    495 Writeln([-] TransmitPort invalid.);
    496 Exit;
    497 end;
    498
    499 FillChar(buffer, 10240);
    500
    501 sockfd := create_socket();
    502 if sockfd = INVALID_SOCKET then
    503 Exit;
    504
    505 if (create_server(sockfd, port1)) = 0 then
    506 begin
    507 closesocket(sockfd);
    508 Exit;
    509 end;
    510
    511 size := SizeOf(sockaddr);
    512
    513 while True do
    514 begin
    515 // Waiting for Client.....
    516 Writeln([+] Waiting for Client.....);
    517 sockfd1 := accept(sockfd, @remote, @size);
    518 if sockfd1 < 0 then
    519 begin
    520 // Accept error.
    521 Writeln([-] Accept error.);
    522 Continue;
    523 end;
    524
    525 // Accept a Client form inet_ntoa( remote.sin_addr ) : ntohs( remote.sin_port)
    526 Writeln(Format([+] Accept a Client %s:%d ......
    527 [inet_ntoa(remote.sin_addr), ntohs(remote.sin_port)]));
    528
    529 sockfd2 := create_socket();
    530 if sockfd2 = 0 then
    531 begin
    532 closesocket(sockfd1);
    533 Continue;
    534 end;
    535
    536 // make a Connection to host : port
    537 // fflush(stdout)
    538 Writeln(Format([+] Make a Connection to %s:%d ......, [host, port2]));
    539
    540 if client_connect(sockfd2, host, port2) = 0 then
    541 begin
    542 closesocket(sockfd2);
    543 // sprintf(buffer,[Server]connection to host:port2
    544 aStr := Format([SERVER]connection to %s:%d error, [host, port2]);
    545 StrCopy(@buffer, PAnsiChar(aStr));
    546 send(sockfd1, buffer, StrLen(buffer), 0);
    547 FillChar(buffer, 10240);
    548 closesocket(sockfd1);
    549 Continue;
    550 end;
    551 // printf Connect OK
    552 Writeln([+] Connect OK!);
    553 sock.fd1 := sockfd1;
    554 sock.fd2 := sockfd2;
    555
    556 hThread := CreateThread(nil0, @transmitdata, @sock, 0, dwThreadID);
    557 if hThread = 0 then
    558 begin
    559 TerminateThread(hThread, 0);
    560 Exit;
    561 end;
    562 Sleep(1000);
    563 // printf CreateThread OK!
    564 Writeln([+] CreateThread OK!);
    565 end;
    566
    567 end;
    568
    569 procedure conn2conn(host1: PAnsiChar; port1: Integer; host2: PAnsiChar;
    570 port2: Integer);
    571 var
    572 sockfd1, sockfd2: TSocket;
    573 hThread: THandle;
    574 sock: transock;
    575 dwThreadID: DWORD;
    576 fds: fd_set;
    577 l: Integer;
    578 buffer: array [0 .. MAXSIZE - 1] of AnsiChar;
    579 begin
    580 while True do
    581 begin
    582 //
    583
    584 sockfd1 := create_socket();
    585 if sockfd1 = 0 then
    586 Exit;
    587 sockfd2 := create_socket();
    588 if sockfd2 = 0 then
    589 Exit;
    590
    591 // make a connection to host1:port1
    592 Writeln(Format([+] Make a Connection to %s:%d...., [host1, port1]));
    593 // ffliush(stdout)
    594 if client_connect(sockfd1, host1, port1) = 0 then
    595 begin
    596 closesocket(sockfd1);
    597 closesocket(sockfd2);
    598 Continue;
    599 end;
    600 // fix by bkbll
    601 // if host1:port1 recved data, then connect to host2:port2
    602 l := 0;
    603 FillChar(buffer, MAXSIZE, 0);
    604 while True do
    605 begin
    606 FD_ZERO(fds);
    607 _FD_SET(sockfd1, fds);
    608
    609 if (sockfd1, @fds, nilnilnil) = SOCKET_ERROR then
    610 begin
    611 if h_errno = WSAEINTR then
    612 Continue;
    613 Break;
    614 end;
    615
    616 if FD_ISSET(sockfd1, fds) then
    617 begin
    618 l := recv(sockfd1, buffer, MAXSIZE, 0);
    619 Break;
    620 end;
    621 Sleep(5);
    622 end;
    623
    624 if (l <= 0then
    625 begin
    626 // there is a error...Create a new connection.
    627 Writeln([-] There is a error...Create a new connection.);
    628 Continue;
    629 end;
    630
    631 while True do
    632 begin
    633 // connect ok!
    634 Writeln([+] Connect OK!);
    635 // make a connection to host2:port2
    636 Writeln(Format([+] Make a Connection to %s:%d...., [host2, port2]));
    637 // fflush(stdout)
    638
    639 if client_connect(sockfd2, host2, port2) = 0 then
    640 begin
    641 closesocket(sockfd1);
    642 closesocket(sockfd2);
    643 Continue;
    644 end;
    645
    646 if send(sockfd2, buffer, 10) = SOCKET_ERROR then
    647 begin
    648 // send failed.
    649 Writeln([-] Send failed.);
    650 Continue;
    651 end;
    652 l := 0;
    653 FillChar(buffer, 0, MAXSIZE);
    654 Break;
    655 end;
    656
    657 // all connect ok!
    658 Writeln([+] All Connect OK!);
    659 sock.fd1 := sockfd1;
    660 sock.fd2 := sockfd2;
    661
    662 hThread := CreateThread(nil0, @transmitdata, @sock, 0, dwThreadID);
    663 if hThread = 0 then
    664 begin
    665 TerminateThread(hThread, 0);
    666 Exit;
    667 end;
    668
    669 Sleep(1000);
    670 // printf CreateThread OK!
    671 Writeln([+] CreateThread OK!);
    672 end;
    673 end;
    674
    675 function testfisvalue(str: PAnsiChar): Integer;
    676 begin
    677 if str = nil then
    678 Exit(0);
    679 if str^ = - then
    680 Exit(0);
    681
    682 Exit(1);
    683 end;
    684
    685 function create_socket(): Integer;
    686 var
    687 sockfd: TSocket;
    688 begin
    689 sockfd := socket(AF_INET, SOCK_STREAM, 0);
    690 if sockfd < 0 then
    691 begin
    692 Writeln([-] Create socket error.);
    693 Exit(0);
    694 end;
    695
    696 Exit(sockfd);
    697 end;
    698
    699 function create_server(sockfd: Integer; port: Integer): Integer;
    700 var
    701 srvaddr: sockaddr_in;
    702 ion: Integer;
    703 begin
    704 srvaddr.sin_port := htons(port);
    705 srvaddr.sin_family := AF_INET;
    706 srvaddr.sin_addr.S_addr := htonl(INADDR_ANY);
    707
    708 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, 11);
    709
    710 if bind(sockfd, sockaddr(srvaddr), SizeOf(sockaddr)) < 0 then
    711 begin
    712 Writeln([-] Socket bind error.);
    713 Exit(0);
    714 end;
    715
    716 if listen(sockfd, CONNECTNUM) < 0 then
    717 begin
    718 Writeln([-] Socket Listen error.);
    719 Exit(0);
    720 end;
    721
    722 Exit(1);
    723 end;
    724
    725 function client_connect(sockfd: Integer; server: PAnsiChar;
    726 port: Integer): Integer;
    727 var
    728 cliaddr: sockaddr_in;
    729 host: phostent;
    730 begin
    731 host := gethostbyname(server);
    732 if host = nil then
    733 begin
    734 Writeln(Format([-] Gethostbyname(%s) error:%d, [server, (h_errno)]));
    735 Exit(0);
    736 end;
    737
    738 cliaddr.sin_family := AF_INET;
    739 cliaddr.sin_port := htons(port);
    740 cliaddr.sin_addr := in_addr(PInAddr(host.h_addr^)^); //
    741
    742 if connect(sockfd, sockaddr(cliaddr), SizeOf(sockaddr)) < 0 then
    743 begin
    744 Writeln(Format([-] Connect %s error: %d, [server, h_errno]));
    745 Exit(0);
    746 end;
    747
    748 Exit(1);
    749 end;
    750
    751 procedure __Main();
    752 var
    753 sConnectHost, sTransmitHost: array [0 .. HOSTLEN - 1] of AnsiChar;
    754 iConnectPort, iTransmitPort: Integer;
    755 wsadata: TWsaData;
    756 i: Integer;
    757 begin
    758 ver();
    759 FillChar(sConnectHost, HOSTLEN, 0);
    760 FillChar(sTransmitHost, HOSTLEN, 0);
    761
    762 WSAStartup(MakeWord(11), wsadata);
    763 method := 0;
    764 CodeSite.send(ParamCount, ParamCount);
    765 for i := 0 to ParamCount do
    766 CodeSite.send(ParamStr(i));
    767 if ParamCount > 2 then
    768 begin
    769 if (ParamStr(1) = -listenand (ParamCount >= 3then
    770 begin
    771 iConnectPort := StrToInt(ParamStr(2));
    772 iTransmitPort := StrToInt(ParamStr(3));
    773 method := 1;
    774 end
    775 else if (ParamStr(1) = -tranand (ParamCount >= 4then
    776 begin
    777 iConnectPort := StrToInt(ParamStr(2));
    778 StrCopy(@sTransmitHost, PAnsiChar(AnsiString(ParamStr(3))));
    779 iTransmitPort := StrToInt(ParamStr(4));
    780 method := 2;
    781 end
    782 else if (ParamStr(1) = -slaveand (ParamCount >= 5then
    783 begin
    784 StrCopy(@sConnectHost, PAnsiChar(AnsiString(ParamStr(2))));
    785 iConnectPort := StrToInt(ParamStr(3));
    786 StrCopy(@sTransmitHost, PAnsiChar(AnsiString(ParamStr(4))));
    787 iTransmitPort := StrToInt(ParamStr(5));
    788 method := 3;
    789 end;
    790 end;
    791
    792 case method of
    793 1:
    794 bind2bind(iConnectPort, iTransmitPort);
    795 2:
    796 bind2conn(iConnectPort, sTransmitHost, iTransmitPort);
    797 3:
    798 conn2conn(sConnectHost, iConnectPort, sTransmitHost, iTransmitPort);
    799 else
    800 usage(PAnsiChar(AnsiString(ParamStr(0))));
    801 end;
    802
    803 if method <> 0 then
    804 begin
    805 closeallfd();
    806 end;
    807
    808 WSACleanup();
    809 end;
    810
    811 end.


    我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
    分享到: