Tentativa fracasada de fazer um programa como telnet e o netcat [RESOLVIDO]

1. Tentativa fracasada de fazer um programa como telnet e o netcat [RESOLVIDO]

samuel
samoliver1914

(usa Lubuntu)

Enviado em 03/04/2015 - 16:53h

Boa tarde, estou tentado fazer um programa como telnet e o netcat, mas so a parte de envia e receber texto, mas nao estou conseguido fazer de jeito nenhum, o codigo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

// blibioteca para socket Tcp
#include "SocketTcp.h"

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>

// e deu um progama que eu fis
// esta fucinado, pega perfeitamente com o nc ou telnet
#define PORT 20108
#define IP "127.0.0.1"
#define MAX_BUFFER 2000
#define PASS "EXIT"

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

// estrutura que representa um socket
Socket s;
char bufferOUT[100];
char bufferIN[MAX_BUFFER];
fd_set in;
struct timeval tv;
int sso, retval;

// configura o todas estruturas e verifica erros
if(setSocket(&s, IP, PORT) == false){
perror("setSocket");
return 1;
}
// chama o connect e verifica erros
if(getConecao(&s) == false){
perror("getConecao");
return 1;
}

FD_ZERO(&in);
FD_SET(0, &in);
FD_SET(getFd(s), &in);

sso = fcntl(getFd(s), F_GETFL, 0);
fcntl(getFd(s), F_SETFL, sso | O_NONBLOCK);

tv.tv_sec = 1;
tv.tv_usec = 0;

while(true){

int rr = select(getFd(s)+1, &in, NULL, NULL, &tv);
printf("Test 1\n");

if(rr < 0){
perror("select");
break;
}
if(rr == 0){
tv.tv_sec = 1;
tv.tv_usec = 0;
}
// Aqui esta fucionado
if(rr && FD_ISSET(getFd(s), &in) ){
printf("Test 3\n");
int r;

memset(bufferIN, 0, MAX_BUFFER);
r = read(getFd(s), bufferIN, MAX_BUFFER);
if(r < 0){
perror("read");
break;
}
if(r == 0){
printf("Connection closed by the remote end\n");
break;
}

bufferIN[r] = '\0';
printf("recebido: %s\n",bufferIN);
fflush(0);

}
// Nao esta entrando aqui
if(rr && FD_ISSET(0, &in) ){
printf("Test 2\n");
int r;
memset(bufferOUT, 0, 100);
r = read(0, bufferOUT, 100);
if(r < 0){
perror("read");
break;
}

printf("enviado: %s\n", bufferOUT);
write(getFd(s), bufferOUT, r);
}

}

closeSocket(&s);
printf("Em Fim!!!\n");

return 0;
}


Como da pra ver ainda sou meio iniciante, mas realmente estou precisando fazer um programa desse.


  


2. Re: Tentativa fracasada de fazer um programa como telnet e o netcat [RESOLVIDO]

Carlos APC
Carlos_Cunha

(usa Linux Mint)

Enviado em 03/04/2015 - 20:34h

Não sei a sua necessidade, mas seria mais facil faze em SHELL do que em C. Ai depende de como seria a utilidade, etc...

#-------------------------------------------------------------------------------------#

"Linux é algo que me fez ter Gosto pela Informática, se tornou um Vicio" - Carlos A. P. Cunha


3. Re: Tentativa fracasada de fazer um programa como telnet e o netcat [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/04/2015 - 00:02h

Ainda não olhei o código todo. Mas uma coisa que eu pude ver é que você não está usando FD_SET() dentro do loop. Deveria, uma vez que select() vai desligar os bits referentes aos descritores que não tiverem eventos.


4. Tentativa fracasada de fazer um programa como telnet e o netcat

samuel
samoliver1914

(usa Lubuntu)

Enviado em 05/04/2015 - 18:01h

Esse programa e para ser uma das funcionalidades de um programa cliente, em que o servido tem uma opcao de shell remoto, e como o programa servido vai ter varias funcionalidades nao da pra usa o netcat ou telnet.

E realmente era porque o FD_SET nao estava no loop, nos tutorias que eu vi sobre a funcao select, nao disseram nada sobre isso e meu ingles ainda nao e bom o suficiente para ler as man pages, muito obrigado nunca ia adivinha que erra isso.