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]