Pagina 1 di 1
linux socket non mi va d'accordo con telnet di windows
Inviato: lun 23 gen 2006, 15:54
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);
}
}
Inviato: lun 23 gen 2006, 18:58
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.
Inviato: lun 23 gen 2006, 19:13
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à...
Ciao
Inviato: lun 23 gen 2006, 23:39
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?
Inviato: mar 24 gen 2006, 0:52
da meritil
bè gli amici con windows ancora ce li ho.. anche se sto pensando seriametne di depennarli
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

Inviato: mar 24 gen 2006, 11:23
da Paoletta
io al corso di sistemi operativi non ho mai toccato win...
Inviato: mar 24 gen 2006, 11:48
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.
Inviato: mar 24 gen 2006, 13:28
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
Inviato: mar 24 gen 2006, 13:38
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