PDA

Visualizza la versione completa : [C] Problema portabilità codice Server UDP da Mac OS a Windows


Paolo1993
23-04-2014, 16:49
Ciao a tutti! Sono nuovo! :ciauz:
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. :madai!?:
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???? :confused:
Grazie in anticipo!



#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);
}
}
}

Scara95
23-04-2014, 17:21
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...

Paolo1993
23-04-2014, 17:27
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?

Scara95
23-04-2014, 17:35
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 (http://www.cygwin.com/) offre un ambiente unix-like su windows
altrimenti puoi riscrivere il codice...

Paolo1993
23-04-2014, 17:51
cygwin (http://www.cygwin.com/) offre un ambiente unix-like su windows
altrimenti puoi riscrivere il codice...

Infatti cercavo qualcuno che mi spiegasse come riscriverlo su Windows :bhò:

Scara95
23-04-2014, 17:56
Infatti cercavo qualcuno che mi spiegasse come riscriverlo su Windows :bhò:

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.

Paolo1993
23-04-2014, 18:04
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...

g.b99pm10
23-04-2014, 18:25
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ì



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.

Paolo1993
23-04-2014, 18:31
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ì



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!! :)

Loading