Newsgroup: it.comp.lang.c
Titolo: [Forse in parte OT] send() e recv() , read() e write().

Salve a tutti.
Sto facendo una applicazione, in C naturalmente, full threaded sotto
piattaforma Linux kernel 2.6.16 gcc 3.3.6 che deve implementare da una
parte un server e dall'altra un client. Il server deve permettere la
navigazione e il "putting" dei file. Un "clone" di ssh sostanzialmente con
il filetransfer incorporato. Tutto ok diciamo, finchè non mi trovo ad
implementare il filetransfer. Il punto è che ho risultati IMPREVEDIBILI.
Alcune volte i file vengono trasferiti correttamente, altre volte vengono
trasferiti solamente alcuni byte, altre volte vengono corrotti (stesso
numero di byte ma con un md5sum differente), altre volte il trasferimento
non avviene minimamente. E ho notato che quasi sempre l'errore risiede
nelle write() che a destinazione fa il server.
Premetto che il server scambia messaggi SOLO sulla porta 5000 e i dati
SOLO sulla 5001. Il client può bindarsi le porte dove vuole, sia per i
messaggi che per i dati.
Ecco il codice lato server:
	int o;
	int rc;
	unsigned long long int counting=0; //contatore byte scritti
	unsigned long long int counting_r=0; // contatore byte ricevuti 
	struct data_flow recv_data;
	/* Struct data_flow è così implementata: struct data_flow {
		char data[PK_LEN];// i dati PK_LEN = 128 
		short last; // se è settato a 1 vuol dire che è l'ultimo "pacchetto" 
		int dim_pkt; // la dimensione dei dati presenti su data[PK_LEN]
	};
	*/
	memset(&recv_data,0,sizeof(struct data_flow));
 
	rc=recv(fd, &recv_data, sizeof(struct data_flow),0);
 
	while (rc > 0) {
		counting_r += rc;
 
		if ((o=write(fd_f,recv_data.data,recv_data.dim_pkt))<recv_data.dim_pkt) {
			if (o<0){
				perror("write");
				//getchar();
			}
			else {
				printf("Write only %d out of %d bytes\n",o,recv_data.dim_pkt);
				//getchar();
			}
 
		}
 
		printf("%d bytes wrote\n",o);
		counting += o;
 
		if(recv_data.last == TRUE) {
			printf("Last Packet!\n");
			break;
		}
		memset(&recv_data,0,sizeof(struct data_flow));
		rc=recv(fd, &recv_data, sizeof(struct data_flow),0);
	}
 
	close(fd_f);
 
	close(fd_f);
 
	if ( shutdown(fd,SHUT_RDWR) == -1 ){
		perror("handle_connection_data() : shutdown() failed ");
		strerror(errno);
		exit(-1);		
	}
Ecco il codice lato client:
		unsigned long long int counting= 0;
		int o;
 
		while ((tosend.dim_pkt=read(fd_S, tosend.data, PK_LEN))>0 && tosend.last == FALSE) {
 
			if(tosend.dim_pkt < PK_LEN) tosend.last = TRUE;
			else tosend.last = FALSE;
 
			if ((o=send(data_socket,&tosend,sizeof(struct data_flow),0))<tosend.dim_pkt) {
				if (o<0){ 
					perror("send");
				}
				else {
					printf("Sent only %d out of %d bytes\n",o,tosend.dim_pkt);
				}
 
			}
 
			counting += o;
 
			//printf("%d bytes sent\n",o);
 
			memset(&tosend,0,sizeof(struct data_flow));
		}
		close(fd_S);
		if ( shutdown(data_socket,SHUT_RDWR) == -1 ){
			perror("data_thread() : shutdown() failed ");
			strerror(errno);
			exit(-1);
		}
Grazie in aticipo a chi mi vorrà aiutare.
Ciao!	

 parte un server e dall'altra un client.
Informatica 2° anno Bologna?
-- 
,Blob{..DX21..} [NP - Peter Hammill - The Fall Of The House Of Usher]
visitate il mio sito:
http://xoomer.virgilio.it/blob.dx21/
----
"The voice is still clear in my head;
it's the last word in monologue....
close-up, interior, night."
Peter Hammill - Incoherence [2004]