linux socket non mi va d'accordo con telnet di windows

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
meritil
Master
Master
Messaggi: 1651
Iscritto il: mar 24 ago 2004, 0:00
Slackware: bluewhite64
Contatta:

linux socket non mi va d'accordo con telnet di windows

Messaggio da meritil »

Ciao a tutti mi servirebbe una mano perchè sto diventando matto...

ho fatto una prova con questo codice che semplicemente crea un socket e lo mette in ascolto sulla porta 5002

provo a connettermi con telnet (applicativo linux) tutto procede bene...

se invece apro un prompt dei comandi da windows e digito:

C:\> telnet "hostaddr" 5002 [invio]

niente da fare.. non da segni di vita...


qualcuno mi sa dire cosa sto ignorando? Grazie mille!


Codice: Seleziona tutto

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>


int main (int argc, char* const argv[]){
  
  int socket_fd, client_socket_fd;
  struct sockaddr_in sname; 
  struct sockaddr_in cname;
  socklen_t client_name_len=0;
  long flags;
  char messaggio[7]={'c','i','a','o',0,10,13};

  socket_fd = socket (AF_INET, SOCK_STREAM, 0);
  
  memset(&sname,0,sizeof(struct sockaddr_in));
  sname.sin_family = AF_INET;
  sname.sin_port = htons(5002);
  sname.sin_addr.s_addr = INADDR_ANY; //inet_addr("192.168.1.100"); 
  
  
  if (-1 == bind (socket_fd,(struct sockaddr *) &sname, sizeof(sname))){
  	perror("bind");
	return EXIT_FAILURE;
	}
  
  if (-1 == listen (socket_fd, 5)){
  	perror("listen");
	return EXIT_FAILURE;
	}
  
	while(1){
	 	client_name_len = (socklen_t) (sizeof(struct sockaddr_in));
  		client_socket_fd = accept (socket_fd, (struct sockaddr *) &cname, &client_name_len);
			if (client_socket_fd >= 0){
				flags = fcntl (client_socket_fd, F_GETFL);
					if (flags >= 0 && (fcntl (client_socket_fd, F_SETFL, flags | O_NONBLOCK) == -1)){
						close(client_socket_fd);
						perror("accept");
					}
			}
		
		printf("Ho accettato una connessione da %s\n", inet_ntoa(cname.sin_addr));
		
		if(!fork()){
			read(client_socket_fd,messaggio,7);
			if(send(client_socket_fd,messaggio,7,0) == -1 ) perror("send");
			
  			close (client_socket_fd);
			return EXIT_SUCCESS;
  		}
		close (client_socket_fd);
		while(waitpid(-1,NULL,WNOHANG) > 0);
	}
}

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Messaggio da masalapianta »

il codice e' corretto, ti consiglio di usare uno sniffer e analizzare i pacchetti che si scambiano client e server; btw se lo scopo era dimostrare che windows e' inusabile per lavorare non serviva scrivere codice apposta, in quanto e' un fatto noto da tempo.

meritil
Master
Master
Messaggi: 1651
Iscritto il: mar 24 ago 2004, 0:00
Slackware: bluewhite64
Contatta:

Messaggio da meritil »

ma porcaccia miseria.. il codice mi sembra corretto anche a me o perlomeno rispetta le specifiche come da pagine man(l'unico riferimento che ho purtroppo).. e poi perchè come ho detto da linux a linux funziona.. il problema è che non ho windows a casa o in ufficio da anni.. non posso sniffare un bel niente... uhmm che @@

non è che qualcuno ha un frammento i codice di un qualsiasi server che apre un socket sul quale telnet(windows) riesce a connettersi?

qualche universitario per esempio, mi ricordo che a sistemi operativi facevamo ste stron.. tutti i semestri come progetti finali.. rovistate gente... e aiutatemi a non istallare windows per carità... :lol:



Ciao

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Messaggio da masalapianta »

meritil ha scritto:ma porcaccia miseria.. il codice mi sembra corretto anche a me o perlomeno rispetta le specifiche come da pagine man(l'unico riferimento che ho purtroppo).. e poi perchè come ho detto da linux a linux funziona.. il problema è che non ho windows a casa o in ufficio da anni.. non posso sniffare un bel niente... uhmm che @@
eh?? ma allora come fai a sapere che non funziona?

meritil
Master
Master
Messaggi: 1651
Iscritto il: mar 24 ago 2004, 0:00
Slackware: bluewhite64
Contatta:

Messaggio da meritil »

bè gli amici con windows ancora ce li ho.. anche se sto pensando seriametne di depennarli :lol: :lol: :lol:


dai ditemi di provare qualche trucco magico percui windows funzioni... please non so dove sbattere la testa.. consigliatemi un libro un pdf un oracolo misterioso tra le montagne ...insomma qualcosa


Ciao :D

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio da Paoletta »

io al corso di sistemi operativi non ho mai toccato win...

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Messaggio da masalapianta »

meritil ha scritto:bè gli amici con windows ancora ce li ho..
rotfl! e tu ti fidi dei loro tentativi? tentativi fatti probabilmente da reti diverse con internet di mezzo, eventuali nat e dio sa cos'altro; al 99% il tuo programma funziona anche con client windows.

meritil
Master
Master
Messaggi: 1651
Iscritto il: mar 24 ago 2004, 0:00
Slackware: bluewhite64
Contatta:

Messaggio da meritil »

Allora ragazzi, faccio un piccolo preambolo:

mi hanno chiesto di pilotare un cazzabubbolo che switcha dispositivi video tramite la porta parallela... lasciamo perdere il tempo che ho perso per capire che /dev/lp0 non è proprio il solito file in cui puoi accedere con la open scrivere con la write ecc... il problema è che il tizio che me l'ha chiesto deve interfacciarsi al server che gestisce sti dispositivi video con i winsocket (immagino tramite le classi di vb.net) appunto mi sono posto il problema di verificare che windows riuscisse a comunicare tramite essi e quindi tramite TELNET (versione windows) prima di consegnare il lavoro e oovviamente riscuotere i dindini.. HO FATTO BENE A PROVARE!


Questo è il codice FUNZIONANTE.. ho aggiunto alcuni controlli più estesi sui segnali e controllo assoluto sul BYTEORDER, infatti il problema stava proprio in questi due punti. Sta di fatto che windows pretende un byteorder alla sua maniera e non fa niente per cercare di amalgamarsi il più possibile alla rete.. praticamente l'antitesi del cosiddetto FAIRMODE vabbè...

Codice: Seleziona tutto

/***************************************************************************
 *   Copyright (C) 2006 by Meritil @ Segreteria De Paolis RE s.r.l.   *
 *   fdepaolis@capoccione.depaolisre.it   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#define PORT 5002


void sigchld_handler(int s){
	while(waitpid(-1, NULL, WNOHANG) > 0 );
}

int main (int argc, char* const argv[]){
  
  int s_fd, c_fd, sin_size, yes=1;
  struct sockaddr_in server; 
  struct sockaddr_in client;
  struct sigaction sa;


	s_fd = socket(PF_INET, SOCK_STREAM, 0);
	if(s_fd==-1) {perror("socket"); return EXIT_FAILURE;}
	
	if(setsockopt(s_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1 ){
		perror("setsockopt");
		return EXIT_FAILURE;
	}
	
		server.sin_family = AF_INET;
		server.sin_port = htons(PORT);
		server.sin_addr.s_addr = htonl(INADDR_ANY);
		memset(&(server.sin_zero), '\0', 8);

	if(bind(s_fd, (struct sockaddr *) &server, sizeof(struct sockaddr)) == -1){
		perror("bind");
		return EXIT_FAILURE;
	}

	if(listen(s_fd, 5) == -1){
		perror("listen");
		return EXIT_FAILURE;
	}

	sa.sa_handler = sigchld_handler;
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = SA_RESTART;
	if(sigaction(SIGCHLD, &sa, NULL) == -1) {
		perror("sigaction");
		return EXIT_FAILURE;
	}

	while(1){

			sin_size = sizeof(struct sockaddr_in);
			
			if((c_fd = accept(s_fd, (struct sockaddr * ) &client, &sin_size)) == -1 ){
				perror("accept");
				continue;
			}
			printf("Server: Ho accettato una connessione da %s\n", inet_ntoa(client.sin_addr));

			if(!fork()){
				close(s_fd);
				//Fate il vostro gioco da qui
				if(send(c_fd, "Ciao Maschio!\n", 14, 0) == -1) perror("send");
				//A qui!
				close(c_fd);
				return EXIT_SUCCESS;
			}
			close(c_fd);
	}
	
	return EXIT_SUCCESS;
}



Spero possa risparmiare giornate a qualche temerario che intendesse scrivere un servizio anche per i client windows.



Ciao mittici

meritil
Master
Master
Messaggi: 1651
Iscritto il: mar 24 ago 2004, 0:00
Slackware: bluewhite64
Contatta:

Messaggio da meritil »

Paoletta ha scritto:io al corso di sistemi operativi non ho mai toccato win...
nemmeno a sistemi 2 ?


bè in onestà devo dirti che se ti capiterà di lavorare in C dovrai metterci mano e tempo per capire come usare le winapi oppure affidarti a interfacce multipiattaforma tipo ACE (che vi consiglio)
io da parte mia odio le pappe pronte, anche se talvolta sono portentose (vedi ACE), quindi il mio bel manualone sulle winapi l'ho comprato :? e uso le winapi (chiedo scusa)



Ariciao

Rispondi