Ola,

>Ent�o, voc� precisa fazer isto:
>* criar o socket 'listener'
>* bind(2)
>* setsockopt(2) SO_REUSEADDR
>* listen(2)
>* accept(2) (sem select) -> socket 'sock1'
>* close(listener) (2)
>* criar o socket 'sock2'
>* connect(2) 'sock2' para o destino
>* FD_SET(sock1, &master); FD_SET(sock2, &master);

Ok. Ate aqui acho que eu fiz corretamente.

So q vc no primeiro passo criou um socket chamado listen e nao usou pra
nada, eu imaginei q ele deveria ser o sock1. Entao eu fiz assim:

 cat redirect.c  |more
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define BACKLOG 10   // Numero de conex�es a esperar em listen()


int main(int argc, char *argv[]){

struct sockaddr_in myaddr;      // Struct (server side)
struct sockaddr_in target;      // Struct (remote host side)
int fdmax;                      // Bigger File Description
int sock1, sock2;               // File Descriptor to sockets
int newfd;                      // New fd
char buffs[1024]="\0";          // Buffer from source
char buffd[1024]="\0";          // Buffer from destination
int nbytes;
int yes=1;                      // To use in setsockopt() SO_REUSEADDR
int addrlen;
int x, y, w;                    // Temp var

if (argc != 4){

        fprintf(stderr,"\nUsage: %s <host to connect> <local port> <remote
port>
 \n\n",argv[0]);
        exit(1);

}

myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = INADDR_ANY;
myaddr.sin_port = htons(atoi(argv[2]));
memset(&(myaddr.sin_zero),'\0',8);

target.sin_family = AF_INET;
target.sin_addr.s_addr = inet_addr(argv[1]);
target.sin_port = htons(atoi(argv[3]));
memset(&(target.sin_zero),'\0',8);

if ((sock1 = socket(AF_INET,SOCK_STREAM,0)) == -1){

        perror("Socket");
        exit(1);

}

if (bind(sock1, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1){

        perror("bind");
        exit(1);

}

if ((setsockopt(sock1,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1)){

        perror("setsockopt");
        exit(1);

}

if (listen(sock1,BACKLOG) == -1){

        perror("listen");
        exit(1);
}


newfd = accept(listener, (struct sockaddr *)&remoto,&addrlen)) == -1){

        perror("accept");
        exit(1)

}

close(sock1);

if ((sock2 = socket(AF_INET,SOCK_STREAM,0)) == -1){

        perror("Socket");
        exit(1);

}

if (connect(sock2, (struct sockaddr *)&target, sizeof(struct sockaddr))
== -1){
        perror("Connect");
        exit(1);
}

FD_SET(sock1,&master);
FD_SET(sock2,&master);

Ahhh, uma duvida!

Como eu fechei o sock1, apos o accept. Quando eu for enviar dado pra esse
cliente... eu enviarei para a variavel newfd, neh ??

>* select

Aqui q emba�ou! Como eu fa�o isso com um select so ??

Como eu uso o mesmo select()  para newfd e sock2 e ainda ao mesmo tempo
para leitura e escrita ??

Eu nao sei como manipular pra varios sockets e ler e escrever ao mesmo tempo!!
Por exemplo:

for(;;){

        if(select(Qq_eu_ponho_aqui+1, e_aqui?, ?, ?, NULL) == -1){

                perror("select");
                exit(1);

        }

Resto do codigo....

}

>* quando houver atividade, leia (atrav�s do read(2); n�o precisa do recv(2))
* depois, mande o que ler (usando write(2); n�o o send(2)), sabendo que
se tiver lido do sock1, vai mandar para o sock2 e vice-versa * se em algum
momento read(2) retornar -1 (end-of-file), feche o outro socket

Beleza. depois q o select() funciona, vo usa o read() e write(). :))

>Se quiser faz�-lo mais complicado, aceitando v�rias conex�es, voc� n�o
ir� fechar o listener ap�s ter aceito o primeiro socket, mas mant�-lo aberto.
Da� em diante, quando houver atividade em um dado socket, voc� precisar�
saber para qual outro enviar (ou fechar).

A inten��o eh ser multi-conex�o. Mas primeiro tem q fazer fun�a pra uma
conex�o!! hehehe :)

Existe tmb a dica que o Rodrigo disse de usar fork's neh... =]

T+

Muito Obrigado.

[ ]'s



------------------------------------------
Use o melhor sistema de busca da Internet
Radar UOL - http://www.radaruol.com.br




Assinantes em 28/08/2002: 2227
Mensagens recebidas desde 07/01/1999: 180988
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista:
            mailto:[EMAIL PROTECTED]

Responder a