PDA

View Full Version : ho un problema con la programmazione di rete su mac os x


Janky
15-03-2007, 19:35
ciao, ho un problema su mac os x con la programmazione di rete

uso c, ho installato xcode in modalità completa, ma quando tento di compilare alcuni file ricevo errori del tipo:

error: 'inet_addr' was not declared in this scope
error: 'wait' was not declared in this scope
error: 'exit' was not declared in this scope

(gli include sono corretti...)

quando queste sono funzioni assolutamente standard e non capisco come mai gcc non me le trovi...

il mio prof dell'uni usa pure lui un macbook pro... quindi non è assolutamente un problema di sistema operativo...

non riesco proprio a risolverlo... mi aiutate per favore? googlando non riesco a trovare nessuna risposta decente...:muro:

kalebbo
15-03-2007, 20:47
Non è normale no. Posta il codice completo e vediamo.

Janky
15-03-2007, 21:02
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>

#define PORT 4000
#define MAX_CMD_LEN 128

void addr_initialize(struct sockaddr_in* indirizzo, int port, long IPaddr){
indirizzo->sin_family = AF_INET;
indirizzo->sin_port = htons((u_short) port);
indirizzo->sin_addr.s_addr = IPaddr;
}

char * ricevi_string(int sd ){
char c;
static char answer[MAX_CMD_LEN];
int answer_len = 0;

while(1){
if(!recv(sd,&c,1,0)){
printf("connessione chiusa dal server");
close(sd);
exit(EXIT_SUCCESS);
}
answer[answer_len] = c;
answer_len++;
if(!c) break;
}

return answer;
}

int main(int argc, char* argv[]){
int sd;
char command[MAX_CMD_LEN];
struct sockaddr_in server_addr;

if(argc!=2){
printf("\n Parametri insesatti\n");
printf("\n USO: esempio SERVERADDRESS\n");
exit(EXIT_FAILURE);
}

addr_initialize(&server_addr,PORT,inet_addr(argv[1])); //mi da errore qui sulla inet_addr

sd = socket(PF_INET,SOCK_STREAM,0);

if(connect(sd,(struct sockaddr*)&server_addr, sizeof(server_addr)) == -1){
printf("\n ERRORE DI CONNESSIONE!\n");
exit(EXIT_FAILURE);
}

printf("Connessione eseguita con successo.\n pronto a ricevere comandi.\n Digitare \"exit\" per uscire");

while(1){
printf("\n>");
fflush(stdout);
fgets(command,128,stdin);
send(sd,command,strlen(command)-1,0);
printf("server> %s", ricevi_string(sd));
}

printf("chiudo");
close(sd);
return EXIT_SUCCESS;
}

cavolo.. il codice l'ho copiato direttamente dal proiettore collegato al macbook pro del mio prof...

la prossima volta che lo vedo provo a chiedere pure a lui, eppure un mio compagno con un macbook normale non ha problemi...

ho provato a disisnstallare xcode, riavviare e reinstallarlo, ma mi da sempre errore dicendo che inet_addr non è stata dichiarata...


oppure più semplicemente anche questo non mi va

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
int pid;
int stato_exit, stato_wait;
pid=fork();
if(pid==0){
printf("Processo figlio\n");
stato_exit = 5;
exit(stato_exit);
}
else{
printf("ho generato un figlio con pid=%d\n",pid);
pid = wait(&stato_wait);
printf("è terminato processo %d con stato%d\n",pid, stato_exit/256);
}
return 0;
}

mi da errore sulla exit e sulla wait

kalebbo
16-03-2007, 13:48
Allora, l'organizzazione delle librerie e la relativa dichiarazione all'interno di esse delle system call posix è leggermente diverso rispetto a Linux.
Per sapere esattamente cosa includere ogni volta non devi fare altre che aprire XCode, nel menu in cima allo schermo selezioni Help e poi Documentation ( qui hai un motore di ricerca per tutte le funzioni C, Java, C++ e Obj-C ). Nel campo di ricerca scrivi la funzione che ti interessa chiamare e lui ti restituisce la man page.
Ad esempio se cerchi la exit ti dà:

Name

exit, _Exit -- perform normal program termination


Library

Standard C Library (libc, -lc)


Synopsis

#include <stdlib.h>
[...]



Quindi a te il pezzo di codice


#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
int pid;
int stato_exit, stato_wait;
pid=fork();
if(pid==0){
printf("Processo figlio\n");
stato_exit = 5;
exit(stato_exit);
}
else{
printf("ho generato un figlio con pid=%d\n",pid);
pid = wait(&stato_wait);
printf("è terminato processo %d con stato%d\n",pid, stato_exit/256);
}
return 0;
}


dà errore perchè non hai incluso stdlib.h per la exit e sys/wait.h per la wait.

Ti consiglio caldamente di non fare riferimento sempre e comunque a listati per Linux perchè ti ripeto alcune sys call posix sono dichiarate in lib diverse.
Spero di averti dato una mano.

Janky
16-03-2007, 14:06
grazie mille! quindi erano gli include sbagliati...

per il secondo listato ci può stare perchè l'han fatto alla lavagna, ma per il primo mi sembra strano perchè il mio prof usa proprio un macbook pro e io l'ho copiato pari pari...

vabbè cmq così funziona, grazie ancora!

kalebbo
16-03-2007, 14:11
Prego!
Ricordati di usare il motore interno di ricerca delle man page di XCode, è molto comodo e le man pages sono aggiornate continuamente(a blocchi di centinaia di Mb purtroppo :| )