|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Mar 2010
Città: Cuneo
Messaggi: 29
|
[C] non mi rilascia la shell
ciao, sono in situazione al limite dell'assurdo O_o
Codice:
memset(buffer, 0, BUFSIZE);
printf("Inserire il comando:\n");
fgets(buffer, BUFSIZE, stdin);
printf("la stringa inserita è: %s", buffer);
buffer[strlen(buffer)-1] = '\0';
printf("ciao");
strcat(buffer, "\r\n"); //CR LF
Nota: inizialmente si bloccava subito dopo la richiesta di inserimento della stringa (senza quindi stamparla subito dopo con la seconda printf), poi, ipotizzando un qualche problema di buffer pieni o simili, ho inserito varie fflush() ed è migliorata la situazione (di ben 1 istruzione!) O_o riavviando non cambia nulla... voi avete qualche idea? magari è qualcosa di banale che mi sfugge (spero)... grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Ma il codice completo qual è? Quando termina il programma?
|
|
|
|
|
|
#3 | |
|
Junior Member
Iscritto dal: Mar 2010
Città: Cuneo
Messaggi: 29
|
Quote:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#define BUFSIZE 100
int main(int argc, char **argv)
{
fflush(stdin);
fflush(stdout);
fflush(stderr);
struct sockaddr_in s_addr;
char buffer[BUFSIZE], filename[100], *filebuffer;
int s, res, filesize;
FILE *f_ptr;
if(argc!=3){
printf("Errore nel passaggio dei parametri!\n");
exit(1);
}else{
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1], &(s_addr.sin_addr)); //ricordo come inet_aton mi converte da stringa in formato "IP" a campo in in_addr
}
s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(s, (struct sockaddr*) &s_addr, sizeof(s_addr));
while(1)
{
memset(buffer, 0, BUFSIZE);
printf("Inserire il comando:\n");
fgets(buffer, BUFSIZE, stdin);
printf("la stringa inserita è: %s", buffer);
buffer[strlen(buffer)-1] = '\0';
printf("ciao");
strcat(buffer, "\r\n"); //CR LF
if(strncmp(buffer,"QUIT\n\r",6)==0){ //se comando è QUIT usciamo
printf("Hai digitato QUIT!\n");
break;
}
sscanf(buffer, "GET %s\r\n", filename); //in filename ci metto il nome del file che ho specificato
res = send(s, buffer, strlen(buffer),0);
if(res == 0)
{
printf("send() fallita, connessione chiusa dal server\n");
break;
}
if(res < 0)
{
printf("send() fallita con errore %d", errno);
break;
}
memset(buffer,0,BUFSIZE); //azzero il buffer
res = recv(s, &buffer, BUFSIZE, 0);
if(res == 0)
{
printf("recv() fallita, connessione chiusa dal server\n");
break;
}
if(res < 0)
{
printf("recv() fallita con errore %d\n", errno);
break;
}
buffer[res] = '\0'; // terminazione stringa
printf("%s", buffer); // stampo il messaggio inviato dal server
memset(buffer,0,BUFSIZE);
if(strcmp(buffer, "OK\r\n")==0)
{
res = recv(s, &buffer, BUFSIZE,0);
sscanf(buffer, "%d", &filesize);
printf("La dimesione del file inviato dal server è: %d\n", filesize);
filebuffer = (char*)malloc((filesize+1)*sizeof(char));
recv(s, &filebuffer, filesize, 0);
f_ptr = fopen(filename, "wb");
fprintf(f_ptr, "%s", filebuffer);
fclose(f_ptr);
free(filebuffer);
}
}
printf("Chiusura della connessione...\n");
close(s);
return 0;
}
il programma non termina, non mi rilascia più la shell dopo avermi chiesto il comando da usare (ed averlo stampato). si blocca, infatti il server mi rileva che si è connesso con il client ma non riceve nulla (dalle send() che seguono nel client dopo il codice in grassetto)... Ultima modifica di Mond0 : 08-05-2012 alle 11:36. |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Oct 2010
Città: Savona
Messaggi: 194
|
Non so se il riferimento alla documentazione e' quello più esatto,
ma se sei in Microsoft OS hai mica guardato qui: http://msdn.microsoft.com/en-us/libr...(v=VS.71).aspx che dice chiaramente se gets fallisce( la funzione ritorna NULL), di guardare: feof o ferror per determinare cosa non gli piace? In parole povere.
__________________
AMD Phenom II X6 3Ghz, MB Gigabyte 790xta-ud4 F4A, 4Gb Ram ddr3, HD Segate Barracuda 1T, SV ASUS GTX 560 Ti DirectCu II ,Monitor Philips 1920x1080 led 2 ms, Xbox360 Slim, Tablet Asus Transformer Pad TF300T, Gameboy Advance, Ipod Touch 16Gb |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:53.




















