Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Problema portabilità codice Server UDP da Mac OS a Windows

    Ciao a tutti! Sono nuovo!
    Studio Ingegneria Informatica e oggi abbiamo iniziato con la programmazione di socket.
    La Professoressa ci ha mostrato del codice su Mac OS che funzionava perfettamente (ve lo allego di seguito) e ci ha detto di provare qualcosa di simile a casa. Il problema è che questo stesso codice su Windows non funziona poichè non vengono riconosciute alcune librerie che a quanto pare su Windows non esistono proprio.
    Leggendo un po qua e là ho visto che su windows si usano le winsock ma non ho idea di come farlo! Andando al sodo...come faccio a far girare questo stesso codice su Windows????
    Grazie in anticipo!

    codice:
    #include <stdio.h>
    
    
    #include <stdlib.h>
    #include <strings.h>
    
    
    #include <unistd.h>
    #include <netinet/in.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    
    
    #define MAXLINE 4096
    
    
    void error(char *msg) {
        perror(msg);
        exit(1);
    }
    
    
    int main(int argc, char *argv[]) {
        int sockfd;
        int portno, clilen;
        int bytesread, counter;
        struct sockaddr_in serv_addr, cli_addr;
        char buffer[MAXLINE];
        
        
        if (argc < 2) {
            fprintf(stderr,"ERROR, no port provided\n");
            exit(1);
        }
        
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if (sockfd < 0) {
            error("ERROR opening socket");
        }
    
    
        bzero((char *) &serv_addr, sizeof(serv_addr));
        portno = atoi(argv[1]);
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(portno);
     
        if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
             error("ERROR on binding");
        }
     
        clilen = sizeof(cli_addr);
        counter = 0;
        for (;;) {
            printf("ciao: %d\n", counter);
             bzero(buffer, MAXLINE);
             bytesread = recvfrom(sockfd, buffer, MAXLINE, 0, (struct sockaddr *)&cli_addr, (socklen_t *)&clilen);
             printf("check\n");
            if(!strcmp(buffer, "T\n")) {
                 counter++;
                time_t t = time(NULL);
                char* timestr = ctime(&t);
                sendto(sockfd, timestr, strlen(timestr)+1, 0, (struct sockaddr *)&cli_addr, clilen);          
            }
            else if(!strcmp(buffer, "R\n")) {
                    counter = 0;
            }
            else if(!strcmp(buffer, "N\n")) {
                char cnt[5]; 
                  sprintf(cnt, "%d", counter);
                   sendto(sockfd, cnt, strlen(cnt)+1, 0, (struct sockaddr *)&cli_addr, clilen);          
            }
            else {
                printf("Premi un tasto...");
                 char c;
                scanf("%c", &c);
                sendto(sockfd, "ricevuto", 10, 0, (struct sockaddr *)&cli_addr, clilen);          
            }
         }
    }
    Ultima modifica di Paolo1993; 23-04-2014 a 16:53

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Puoi utilizzare cygwin...
    Oppure, fortemente consigliato da parte mia, scaricare una distro linux e installarla su macchina virtuale o in una partizione del pc o, volendo, in una chiavetta usb...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Puoi utilizzare cygwin...
    Oppure, fortemente consigliato da parte mia, scaricare una distro linux e installarla su macchina virtuale o in una partizione del pc o, volendo, in una chiavetta usb...
    Ciao, ho trovato qualcosa su questo cygwin ma non ho capito bene come funziona. Per quanto riguarda linux su macchina virtuale l'ho già e ho anche un altro PC con Ubuntu ma volevo farlo girare su Windows... Non sai come fare?

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da Paolo1993 Visualizza il messaggio
    Ciao, ho trovato qualcosa su questo cygwin ma non ho capito bene come funziona. Per quanto riguarda linux su macchina virtuale l'ho già e ho anche un altro PC con Ubuntu ma volevo farlo girare su Windows... Non sai come fare?
    cygwin offre un ambiente unix-like su windows
    altrimenti puoi riscrivere il codice...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    cygwin offre un ambiente unix-like su windows
    altrimenti puoi riscrivere il codice...
    Infatti cercavo qualcuno che mi spiegasse come riscriverlo su Windows

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da Paolo1993 Visualizza il messaggio
    Infatti cercavo qualcuno che mi spiegasse come riscriverlo su Windows
    Se usi cygwin non ti serve riscriverlo probabilmente, vedi il sito ufficiale che ho linkato sopra. Per riscriverlo devi studiare le librerie per windows.

    Edit: Windows e i sistemi unix-like sono profondamente diversi.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Se usi cygwin non ti serve riscriverlo probabilmente, vedi il sito ufficiale che ho linkato sopra. Per riscriverlo devi studiare le librerie per windows.
    Si grazie l'ho visto e già l'ho scaricato e mi sto adattando con quello. Il fatto è che io uso per lo più Windows e speravo di riuscire a farlo con quello...

  8. #8
    ciao. Su win devi inizializzare l'utilizzo dei socket. Per il resto, il codice è abbastanza simile, le strutture sono identiche, anche la funzione bind sembra uguale...

    per l'inizializzazione fai così

    codice:
    WSADATA data; // inizializzare la variabile che contiene le primitive di Winsock
    WORD p;
    p=MAKEWORD(2,0); // creo la variabile p che contiene la versione della wsock32.dll
    err=WSAStartup(p,&data); 
    p.s inserisci #pragma comment(lib, "wsock32.lib")

    tra gli include.
    tutto si può fare, bisogna solo volerlo
    http://italybrain.altervista.org/

  9. #9
    Quote Originariamente inviata da g.b99pm10 Visualizza il messaggio
    ciao. Su win devi inizializzare l'utilizzo dei socket. Per il resto, il codice è abbastanza simile, le strutture sono identiche, anche la funzione bind sembra uguale...

    per l'inizializzazione fai così

    codice:
    WSADATA data; // inizializzare la variabile che contiene le primitive di Winsock
    WORD p;
    p=MAKEWORD(2,0); // creo la variabile p che contiene la versione della wsock32.dll
    err=WSAStartup(p,&data); 
    p.s inserisci #pragma comment(lib, "wsock32.lib")

    tra gli include.
    Grazie perfetto adesso provo!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.