Quando passo i parametri dal prompt, cioè porta e ip, il server smette di funzionare;
ho potuto notare che dipende da ParseCmdLine il quale mi da problemi con port.
Siccome il codice non l'ho fatto io volevo sapere se oltre al port (passo -5000) e ip(-mio.ip) devo passare altri parametri ? potete aiutarmi a farlo funzionare ?
#include <winsock.h>
#include <stdlib.h>
#include <stdio.h>
#define LISTENQ (1024)
#define MAX_LINE (1000)
int ParseCmdLine(int argc, char *argv[], char **szPort); //controlla se i parametri passati nel main siano corretti
int main(int argc,char* argv[]){
#pragma comment(lib, "ws2_32.lib") // Risolve problemi con il Linker tipo LNK2019.
printf("Avvio server in corso...\n");
WSADATA wsaData;
struct sockaddr_in target;
struct sockaddr_in accepted;
short int port; /* port number */
char *endptr; /* for strtol() */
int acceptedLen; // accept scriverà la propria taglia
char buffer[MAX_LINE]; /* character buffer */
/* Get command line arguments */
ParseCmdLine(argc, argv, &endptr);
port = strtol(endptr, &endptr, 0);
if ( *endptr )
{
fprintf(stderr, "server: porta non riconosciuta.\n");
exit(EXIT_FAILURE);
}
printf("Server in ascolto sulla porta %d\n",port);
if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {
printf("errore in WSAStartup()\n");
exit(EXIT_FAILURE);
}
/* Creo il socket */
SOCKET sock;
SOCKET newSock;
printf("\nCreazione socket in corso...");
sock=socket(AF_INET, SOCK_STREAM, 0);
memset(&target, 0, sizeof(target));
target.sin_family = AF_INET;
target.sin_addr.s_addr = htonl(INADDR_ANY);
target.sin_port = htons(port);
/* Effettuo il bind */
printf("\nBind in corso...");
if(bind(sock,(struct sockaddr *)&target, sizeof(target))==-1){
printf("Errore nel bind");
}
/* Mi metto in ascolto */
if(listen(sock,LISTENQ) ==SOCKET_ERROR) { // listenq sono il numero di connessioni sospese
printf("server: Errore durante la listen");
exit(EXIT_FAILURE);
}
/* Creo un nuovo socket per la connessione del singolo client */
while(1) {
printf("\nSono in attesa di una connessione...\n");
if((newSock = accept(sock, (struct sockaddr *) &accepted, &acceptedLen))!=-1){ printf("\nErrore: Impossibile creare un nuovo socket!\nConnessione fallita\n");
}
/* Primo contatto con il client */
printf("server: connessione da %s:%d\n", inet_ntoa(accepted.sin_addr),accepted.sin_port);
do {
recv(newSock, buffer, MAX_LINE-1,0);
printf("Messaggio del client=%s\n",buffer);
} while (strcmp(buffer,"quit")!=0);
send(newSock, "letto", strlen(buffer),0);
exit(0);
}
/* Close the connected socket */
if ( closesocket(newSock) == SOCKET_ERROR )
{
fprintf(stderr, "server: errore durante la close.\n");
exit(EXIT_FAILURE);
}
if ( closesocket(sock) == SOCKET_ERROR )
{
fprintf(stderr, "server: errore durante la close.\n");
exit(EXIT_FAILURE);
}
WSACleanup();
}
int ParseCmdLine(int argc, char *argv[], char **szPort)
{
int n = 1;
while ( n < argc )
{
if ( !strncmp(argv[n], "-p", 2) || !strncmp(argv[n], "-P", 2) )
*szPort = argv[++n];
else
if ( !strncmp(argv[n], "-h", 2) || !strncmp(argv[n], "-H", 2) )
{
printf("Sintassi:\n\n");
printf(" server -p (porta) [-h]\n\n");
exit(EXIT_SUCCESS);
}
++n;
}
if (argc==1)
{
printf("Sintassi:\n\n");
printf(" server -p (porta) [-h]\n\n");
exit(EXIT_SUCCESS);
}
return 0;
}
|