Teo@Unix
24-02-2010, 13:03
Ciao,
sto scrivendo un semplice client su console in stile telnet.
Però sto utilizzando le librerie Qt e scrivendo in C++, dato che vorrei compilarla per più piattaforme.
In C per l'I/O utilizzavo la solita select() e gestivo con le relative macro il multiplexing.... su Qt non dovrebbe essere molto diverso a parte essere più semplice, a quanto vedo con TCPSocket devo usare il metodo ReadyRead() giusto?
Il punto è con stdout e stdin come faccio? Devo abbinare questi ad un oggetto QIODevice? Non avreste un esempio ?
Il codice C da implementare è tipo il seguente:
void
prompt(FILE* fp, int sock)
{
int maxfd;
char send_buffer[BUFF_SIZE], recv_buffer[BUFF_SIZE];
fd_set rset;
FD_ZERO(&rset);
while(1)
{
FD_SET(fileno(fp),&rset);
FD_SET(sock,&rset);
maxfd = MAX(fileno(fp),sock)+1;
select(maxfd,&rset,NULL,NULL,NULL);
if(FD_ISSET(sock,&rset))
{
memset(recv_buffer,0,sizeof(recv_buffer));
if(read(sock,recv_buffer,BUFF_SIZE) <= 0)
{
perror("read");
exit(-1);
}
fprintf(stdout,"%s\n$ ",recv_buffer);
fflush(stdout);
}
if(FD_ISSET(fileno(fp),&rset))
{
memset(send_buffer,0,sizeof(send_buffer));
if(fgets(send_buffer,BUFF_SIZE,fp) == NULL)
return;
if(write(sock,send_buffer,strlen(send_buffer)+1) <= 0)
{
perror("write");
exit(-1);
}
}
}
}
sto scrivendo un semplice client su console in stile telnet.
Però sto utilizzando le librerie Qt e scrivendo in C++, dato che vorrei compilarla per più piattaforme.
In C per l'I/O utilizzavo la solita select() e gestivo con le relative macro il multiplexing.... su Qt non dovrebbe essere molto diverso a parte essere più semplice, a quanto vedo con TCPSocket devo usare il metodo ReadyRead() giusto?
Il punto è con stdout e stdin come faccio? Devo abbinare questi ad un oggetto QIODevice? Non avreste un esempio ?
Il codice C da implementare è tipo il seguente:
void
prompt(FILE* fp, int sock)
{
int maxfd;
char send_buffer[BUFF_SIZE], recv_buffer[BUFF_SIZE];
fd_set rset;
FD_ZERO(&rset);
while(1)
{
FD_SET(fileno(fp),&rset);
FD_SET(sock,&rset);
maxfd = MAX(fileno(fp),sock)+1;
select(maxfd,&rset,NULL,NULL,NULL);
if(FD_ISSET(sock,&rset))
{
memset(recv_buffer,0,sizeof(recv_buffer));
if(read(sock,recv_buffer,BUFF_SIZE) <= 0)
{
perror("read");
exit(-1);
}
fprintf(stdout,"%s\n$ ",recv_buffer);
fflush(stdout);
}
if(FD_ISSET(fileno(fp),&rset))
{
memset(send_buffer,0,sizeof(send_buffer));
if(fgets(send_buffer,BUFF_SIZE,fp) == NULL)
return;
if(write(sock,send_buffer,strlen(send_buffer)+1) <= 0)
{
perror("write");
exit(-1);
}
}
}
}