li codice lo ho trovato mentre giravo in cerca di informazioni sul wiinsock:
codice:
/* LISTATO C/C++ DI MIOSERVER
REALIZZATO DA BARTOLOMEO DAVIDE BERTINETTO
HOME: HTTP://DIGILANDER.IOL.IT/ALLEGRO.H
E-MAIL: INFOCALIMERO@LIBERO.IT
*/
#include <stdio.h>
#include <winsock.h>
#define ESC 0x1b
// Fino a qui nulla di speciale, importo le librerie
//che servono e stabilisco quale tasto è l'esc...
//Cosa importante è ricordarsi di linkare la libreria libwsock32.a
//(nel caso di DevC++, per gli altri compilatori non so se si chiama cosi)
int main (void)
{
SOCKET socklis,sockacp;
sockaddr_in socklis_in,sockacp_in;
WORD wVersionRequested;
WSADATA wsaData;
int err, backlog=1, addrlen;
char recvb;
// Qui sopra vengono dichiarate le veriabili, da notare le
// variabili di tipo SOCKET; i socket sono quegli strumenti
// che servono per comunicare nella rete, possiamo immaginarli
//come un canale tra 2 punti, una volta aperto e
// accettato, puo essere usato per inviare dati.
// altra cosa da notare è la wsaData, in seguito verrà usata per verificare
// la versione della winsock.dll installata sulla macchina.
wVersionRequested = MAKEWORD( 2,0 );
printf("Miniserver su porta 4444\n\n");
WSAStartup( wVersionRequested, &wsaData );
// Con WSAStartup() la winsock.dll viene inizializzata,
//indicando la versione richiesta
// e la locazione della strusttura wsaData, che verrà
//usata per immagazzinare i dati della dll
socklis = socket (PF_INET, SOCK_STREAM, 0);
socklis_in.sin_family = PF_INET;
socklis_in.sin_port = htons (4444);
socklis_in.sin_addr.s_addr = INADDR_ANY;
// Una volta inizializzata la winsock.dll, viene aperto il
//socket, specificando il protocollo usato
// (PF_INET è il TCP/IP), la porta locale e l'indirizzo locale
bind (socklis, (struct sockaddr*)&socklis_in, sizeof(struct sockaddr_in));
listen(socklis, backlog);
printf("In attesa di una connessione...\n");
// Ora il socket deve essere inizializzato con la funzione bind(),
// in questo modo viene inizializzata con i valori contenuti nella
// struttura socklis_in, definiti prima (protocollo, porta e indirizzo)
// Dopodiche si mette in attesa il socket, con la funzione listen()
addrlen=sizeof(struct sockaddr);
sockacp=accept(socklis, (struct sockaddr*)&sockacp_in, (LPINT)&addrlen);
// Per preparare il socket ad accettare una connessione,
// si usa la funzione accept() che, come parametri richiede
// il socket in ascolto e una struttura tipo sockaddr_in che verrà
// riempita dai dati che il client invierà al server.
send(sockacp, "Scrivi qualcosa e verrà inviato alla finetra dos remota. Premi 'esc' per terninare la connessione.\r\n", strlen("Scrivi qualcosa e verrà inviato alla finetra dos remota. Premi 'esc' per terninare la connessione.\r\n"), 0);
// frase visualizzata su telnet remoto
printf("In attesa di ordini...\n");
// frase visualizzata nella finetra dos del client
while(recvb!=ESC)
{
recv(sockacp, &recvb, 1, 0);
printf("%c",recvb);
}
// invia un messaggio da telnet alla dinestra dos in remoto
// Termina il ciclo dopo aver premuto il tasto 'esc' da telnet
closesocket(sockacp);
closesocket(socklis);
return(0);
}
in effetti adesso lo compila e quando lo eseguo le scritte le da. avendo un solo pc non posso testare anche il client
cioè, mi spiego: se apro prima il server e poi il client sullo stesso pc, il server non se ne accorege!
credo possa essere un conflitto sulla porta dell stesso pc.
client:
codice:
/* LISTATO C/C++ DI MIOCLIENT
REALIZZATO DA BARTOLOMEO DAVIDE BERTINETTO
HOME: HTTP://DIGILANDER.IOL.IT/ALLEGRO.H
E-MAIL: INFOCALIMERO@LIBERO.IT
*/
#include <stdio.h>
#include <winsock.h>
#define ESC 0x1b
// Fino a qui nulla di speciale, importo le librerie
//che servono e stabilisco quale tasto è l'esc...
//Cosa importante è ricordarsi di linkare la libreria libwsock32.a
//(nel caso di DevC++, per gli altri compilatori non so se si chiama cosi)
int main (void)
{
SOCKET socklis,sockacp;
sockaddr_in socklis_in,sockacp_in;
WORD wVersionRequested;
WSADATA wsaData;
int err, backlog=1, addrlen;
char recvb;
// Qui sopra vengono dichiarate le veriabili, da notare le
// variabili di tipo SOCKET; i socket sono quegli strumenti
// che servono per comunicare nella rete, possiamo immaginarli
//come un canale tra 2 punti, una volta aperto e
// accettato, puo essere usato per inviare dati.
// altra cosa da notare è la wsaData, in seguito verrà usata per verificare
// la versione della winsock.dll installata sulla macchina.
wVersionRequested = MAKEWORD( 2,0 );
printf("Miniserver su porta 4444\n\n");
WSAStartup( wVersionRequested, &wsaData );
// Con WSAStartup() la winsock.dll viene inizializzata,
//indicando la versione richiesta
// e la locazione della strusttura wsaData, che verrà
//usata per immagazzinare i dati della dll
socklis = socket (PF_INET, SOCK_STREAM, 0);
socklis_in.sin_family = PF_INET;
socklis_in.sin_port = htons (4444);
socklis_in.sin_addr.s_addr = INADDR_ANY;
// Una volta inizializzata la winsock.dll, viene aperto il
//socket, specificando il protocollo usato
// (PF_INET è il TCP/IP), la porta locale e l'indirizzo locale
bind (socklis, (struct sockaddr*)&socklis_in, sizeof(struct sockaddr_in));
listen(socklis, backlog);
printf("In attesa di una connessione...\n");
// Ora il socket deve essere inizializzato con la funzione bind(),
// in questo modo viene inizializzata con i valori contenuti nella
// struttura socklis_in, definiti prima (protocollo, porta e indirizzo)
// Dopodiche si mette in attesa il socket, con la funzione listen()
addrlen=sizeof(struct sockaddr);
sockacp=accept(socklis, (struct sockaddr*)&sockacp_in, (LPINT)&addrlen);
// Per preparare il socket ad accettare una connessione,
// si usa la funzione accept() che, come parametri richiede
// il socket in ascolto e una struttura tipo sockaddr_in che verrà
// riempita dai dati che il client invierà al server.
send(sockacp, "scritta dalla finestra del client dos remoto.\r\n", strlen("scritta dalla finestra del client dos remoto.\r\n"), 0);
// frase visualizzata su telnet remoto
printf("In attesa di ordini...\n\nCon la perssione del tasto 'esc' seguito da 'invio' termina la connessione.\n\n");
printf("Scrivere delle parole e premere 'invio' per inviarle a telnet remoto.\n\n");
// frase visualizzata nella finetra dos del client
while(recvb!=ESC)
{
recvb = getchar();
send(sockacp, &recvb, strlen(&recvb), 0);
}
// invia un messaggio(dopo ever premuto enter) dal client dos a telnet remoto
// Termina il ciclo dopo aver premuto il tasto 'esc' seguito da 'invio'
closesocket(sockacp);
closesocket(socklis);
return(0);
}
non è molto grosso, comunque grazie per il sito non sapevo della sua esietnza, potrebbe tornare utile!