PDA

Visualizza la versione completa : [C] Applicazione client/server con trasferimento dati da riga di comando


TommyGun
28-04-2007, 18:19
Salve ragazzi,
ho un problemino da risolvere con una applicazione client sever, dovrei creare due programmi diciamo S e C che producano le seguenti azioni:
- S apre una socket in ascolto ed aspetta connessioni
- C prende due parametri da linea di comando: (1) il nome di un device dal quale leggere e (2) il numero di bytes da leggere e spedire ad S. Apre il device specificato, legge il numero di bytes specificati e mette i dati in un buffer ed infine apre una socket ad S e spedisceil contenuto del buffer ad S.
- S legge i dati e li stampa e risponde a C con il numero di bytes letti ed i dati letti
- C legge quanto arriva da S e stampa a video

Il punto in cui mi sono fermato il secondo, non ho proprio idea su come realizzarlo.

TommyGun
30-04-2007, 10:19
:( nulla di nulla! :(

XWolverineX
30-04-2007, 10:32
cosa non sai fare del secondo punto?
non sai utilizzare gli argomenti del main per la riga del comando? non sai come aprire il device specificato?
Posta anche il codice del primo punto, per sapere meglio come stai lavorando.

bigmickey
30-04-2007, 11:12
Non sei stato molto specifico cmq i passi da seguire sono piu o meno questi:

- Passare i parametri da riga di comando
main(int argc , char *argv[])
dove arg il numero dei parametri (puoi controllare che sia stato inserito il numero giusto)
e *argv[] un vettore di stringhe in cui sono memorizzatii comandi (separati da uno spazio).
Il comando i-esimo lo individui con argv[i].

-Aprire il device
Hai bisogno di un handle per il tuo device.
Che tipo di device ?

-Aprire una socket ad S e spedire il contenuto del buffer ad S
Qui devi semplicemente aprire un socket TCP immagino (se parli di connessione)
sulla porta in cui in ascolto il server e naturalmente spedire i dati.



Se sei un p pi specifico , magari ti posso dire qualcosa in piu.

TommyGun
30-04-2007, 12:21
Originariamente inviato da bigmickey
Non sei stato molto specifico cmq i passi da seguire sono piu o meno questi:

- Passare i parametri da riga di comando
main(int argc , char *argv[])
dove arg il numero dei parametri (puoi controllare che sia stato inserito il numero giusto)
e *argv[] un vettore di stringhe in cui sono memorizzatii comandi (separati da uno spazio).
Il comando i-esimo lo individui con argv[i].


ok ok, scusami per la non precisazione ma questo passo va bene, so' come utilizzare i parametri. Grazie lo stesso.



-Aprire il device
Hai bisogno di un handle per il tuo device.
Che tipo di device ?


E' questo il punto cruciale, ti posto il testo dell'esercizio relativo a questo punto:

Program "C" executes, takes as a command-line two parameters: (1) the name of a device from which to read, and (2) the number of bytes to read and send to the other process. Note that the name of a device is of the form "random", not "/dev/random", as local device naming conventions and access methodologies vary from operating system to operating system. The default device is "random" and the default number of bytes to read is 1024.
Program "C" open the specified device, read the specified number of bytes from that device into a buffer.

Scusate se e' in inglese, ma spero sia comunque abbastanza chiaro...

Grazie

bigmickey
30-04-2007, 12:38
A questo punto credo che bisogna sapere su che piattaforma lavori.

Se sei su windows le funzioni dell' API che dovrebbe interessarti credo che siano
DeviceIOControl , CreateFile , ReadFile .
Ti permettono di entrare in comunicazione con il device driver, lo vedi come un file e lo leggi.
A esempio con la porta seriale, puoi leggere e scrivere come se fosse un file.

TommyGun
30-04-2007, 12:38
Originariamente inviato da XWolverineX
cosa non sai fare del secondo punto?
non sai utilizzare gli argomenti del main per la riga del comando? non sai come aprire il device specificato?
Posta anche il codice del primo punto, per sapere meglio come stai lavorando.

Ok ti posto il codice, premetto che il programma S relativo al primo punto dovrebbe essere una applicazione server, quindi sto' provando questo codice:

Server:


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h> /* socket(), bind(), listen(), accept() */
#include <netinet/in.h>
#define PORT 4000
int main (int argc, char* argv[])
{
int fd, newfd, clen;
struct sockaddr_in saddr, caddr;
char command;
char buf[1000];

saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons((u_short) PORT);

fd = socket(AF_INET, SOCK_STREAM, 0);

bind(fd, (struct sockaddr *) &saddr, sizeof(saddr));
listen(fd, 5);
printf("Waiting for connections...\n");
newfd = accept(fd, (struct sockaddr*) &caddr, &clen);

printf("\n\nConnection accepted!\n");

while(1) {

recv(newfd, &command,1,0);

switch(command) {
case 'a':
printf("A");
//write(newfd, "A", strlen("A"));
//write(1, "A",strlen("A"));
send(newfd, "A",1,0);
break;
case 'b':
send(newfd, "B",1,0);
break;
default:
send(newfd, "X",1,0);
break;
}

}
close(newfd);
close(fd);

return 0;
}

con questo codice relativo al client:



#include <stdio.h>
#include <stdlib.h> /* exit() */
#include <sys/types.h>
#include <sys/socket.h> /* socket(), bind(), listen(), accept() */
#include <netinet/in.h>
#define PORT 4000

int main (int argc, char* argv[])
{
int fd, err;
struct sockaddr_in saddr;
char command, result;
char buf[1000];

saddr.sin_family = AF_INET;
saddr.sin_port = htons((u_short) PORT);
saddr.sin_addr.s_addr = inet_addr(argv[1]);

fd = socket(AF_INET, SOCK_STREAM, 0);
err = connect(fd, (struct sockaddr *) &saddr, sizeof(saddr));

if (err == 0) {
printf("sono qui!!!");

command = getchar();
send(fd, &command, 1, 0);
while (recv(fd, &result, 1, 0) != 1)
//do nothing
printf("Sono qui!!");
;
printf("%s",result);
putchar (result);
}

else {
printf ("Connection error\n");
close(fd);
exit(1);
}

close(fd);
}



ma fino ad ora ho ottenuto dal server il messaggio di "connection accepted!", ma se invio i caratteri 'a' o 'b' o qualcos altro al server, non mi risponde!
Questo codice in effetti non c'entra molto con l'esercizio che devo fare, ma e' solo per provare la comunicazione tra i processi, cosa questa importante per l'esercizio.

Spero di non aver creato troppa confusione, come sono solito fare...

Grazie

TommyGun
30-04-2007, 12:39
Originariamente inviato da bigmickey
A questo punto credo che bisogna sapere su che piattaforma lavori.

Se sei su windows le funzioni dell' API che dovrebbe interessarti credo che siano
DeviceIOControl , CreateFile , ReadFile .
Ti permettono di entrare in comunicazione con il device driver, lo vedi come un file e lo leggi.
A esempio con la porta seriale, puoi leggere e scrivere come se fosse un file.

Sono su Linux

bigmickey
30-04-2007, 12:52
Ti premetto che non ho mai sviluppato su linux,
per in fondo i scoket sono sempre quelli di Berkley, ora do uno sguardo al codice.
Nel frattempo ti consiglio di fare le cose una alla volta.
Prima testa il server con un client sicuramente funzionante,
una volta che sei sicuro che il server riceve e risponde,
allora prova a mandare i comandi con un client tuo.

bigmickey
30-04-2007, 13:04
C' un ";" in pi nel client, non so cosa possa fare...
non che non esce dal ciclo?



while (recv(fd, &result, 1, 0) != 1)
//do nothing
printf("Sono qui!!");
; <------------------------

Loading