Salve a tutti, grazie ad alcune dispense online e qualche tutorial ho creato un server e un client di base, in C, con le winsock. Funziona tutto bene, sul mio PC. Ho provato ad inviare il client ad un mio amico su un altro pc, e ho lasciato il server sul mio. Ma non si connette. Come mai? Sono abbastanza ignorante in materia, quindi forse ho detto una mega-castroneria, se è così non andateci troppo pesante
Se serve saperlo, eravamo tutti e due su Windows.
Il server è questo:
codice:
#include <stdio.h>
#include <winsock.h>
void main(){
/*
La funzione WSASTARTUP restituisce 0 in caso di successo,
altrimenti un codice di errore.
*/
WSADATA wsaData;
int iResult;
iResult=WSAStartup(MAKEWORD(2, 2), &wsaData);
if(iResult!=NO_ERROR)
printf("Error at WSAStartup.\n");
/*
La funzione SOCKET restituisce un intero che è un descrittore
che referenzia la nuova socket in caso di successo.
Altrimenti restituisce un codice di errore.
*/
SOCKET m_socket;
m_socket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(m_socket==INVALID_SOCKET){
printf("Error at socket(): %ld.\n", WSAGetLastError());
WSACleanup();
return;
}
/*
La struttura SOCKADDR_IN specifica l'address family, l'indirizzo IP
e il numero di porta per il socket.
La funzione BIND associa un nome alla socket creata in precedenza e
restituisce 0 in caso di successo, altrimenti un codice di errore.
*/
SOCKADDR_IN service;
service.sin_family=AF_INET;
service.sin_addr.s_addr=inet_addr("127.0.0.1");
service.sin_port=htons(27015);
if(bind(m_socket, (SOCKADDR*) &service, sizeof(service))==SOCKET_ERROR){
printf("bind() failed.\n");
closesocket(m_socket);
return;
}
/*
La funzione LISTEN setta la socket in uno stato in cui rimane in attesa
di richiesta di connessioni. Restituisce 0 in caso di successo, altrimenti
un codice di errore. Come parametri riceve la socket creata e il numero
massimo di connessioni che accetta.
*/
if(listen(m_socket, 1)==SOCKET_ERROR)
printf("Error at listen().\n");
/*
La funzione ACCEPT consente un tentativo di connessione in entrata su
una socket. La funzione estrae la prima connessione dalla coda delle
connessioni sul socket. Successivamente crea e restituisce un
riferimento ad una nuova socket. Questa nuova socket è quella che
abbiamo chiamato socket di connessione e mantiene le stesse proprietà
della socket di partenza.
*/
SOCKET AcceptSocket;
printf("Waiting for a client to connect..\n");
while(1){
AcceptSocket=SOCKET_ERROR;
while(AcceptSocket==SOCKET_ERROR){
AcceptSocket=accept(m_socket, NULL, NULL);
}
printf("Client Connected.\n");
m_socket=AcceptSocket;
break;
}
/*
La funzione SEND invia dati ad una socket connessa. La funzione
restituisce il numero di byte trasmessi in caso di successo.
Altrimenti, un codice di errore.
La funzione RECEV riceve dati da una socket connessa.
*/
int bytesSent;
int bytesRecv=SOCKET_ERROR;
char sendbuf[32]="Server: Sending Data.";
char recvbuf[32]="";
bytesRecv=recv(m_socket, recvbuf, 32, 0);
printf("Bytes Received: %ld\n", bytesRecv);
bytesSent=send(m_socket, sendbuf, strlen(sendbuf), 0);
printf("Bytes Sent: %ld\n", bytesSent);
return;
}
Il client è questo:
codice:
#include <stdio.h>
#include <winsock.h>
void main(){
/*
La funzione WSASTARTUP restituisce 0 in caso di successo,
altrimenti un codice di errore.
*/
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
/*
La funzione SOCKET restituisce un intero che è un descrittore
che referenzia la nuova socket in caso di successo.
Altrimenti restituisce un codice di errore.
*/
SOCKET ConnectSocket;
ConnectSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ConnectSocket==INVALID_SOCKET){
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return;
}
/*
La struttura SOCKADDR_IN specifica l'address family, l'indirizzo IP
e il numero di porta per il socket.
La funzione CONNECT stabilisce una connessione ad una socket specificata.
*/
SOCKADDR_IN clientService;
clientService.sin_family=AF_INET;
clientService.sin_addr.s_addr=inet_addr("127.0.0.1");
clientService.sin_port=htons(27015);
if(connect(ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService))==SOCKET_ERROR){
printf("Failed to connect.\n");
WSACleanup();
return;
}
/*
La funzione SEND invia dati ad una socket connessa. La funzione
restituisce il numero di byte trasmessi in caso di successo.
Altrimenti, un codice di errore.
La funzione RECEV riceve dati da una socket connessa.
*/
int bytesSent;
int bytesRecv=SOCKET_ERROR;
char sendbuf[32]="Server: Sending Data.";
char recvbuf[32]="";
bytesSent=send(ConnectSocket, sendbuf, strlen(sendbuf), 0);
printf("Bytes Sent: %ld\n", bytesSent);
if(bytesRecv==0 || (bytesRecv==SOCKET_ERROR && WSAGetLastError()==WSAECONNRESET)){
bytesRecv=recv(ConnectSocket, recvbuf, 32, 0);
if(bytesRecv==-1){
printf("Connection Closed.\n");
}
if(bytesRecv<0){
return;
}
printf("Bytes Received: %ld\n", bytesRecv);
}
}