View Full Version : ho un problema con la programmazione di rete su mac os x
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:
Non è normale no. Posta il codice completo e vediamo.
#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
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.
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!
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 :| )
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.