Il codice corretto con tutto quello che hai aggiunto, adesso qual č ?
Il codice corretto con tutto quello che hai aggiunto, adesso qual č ?
No MP tecnici (non rispondo nemmeno!), usa il forum.
Questo č l' ultimo che ho scritto con il problema nel bind:
codice:#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <errno.h> #include <unistd.h> #define LOCIP "127.0.0.1" #define BUFFSIZE 1024 #define PORT 2000 #define CONNECTIONS 512 int main(int argc, char * arv[]) { int servId, clientId, retcode; //ID Server, Client, contatore byte struct sockaddr_in servip, clientip; //Strutture per indirizzo ip server e client socklen_t servipL, clientipL; //lunghezza indirizzi char buffer[BUFFSIZE]; char msg[BUFFSIZE]; if((servId=socket(PF_INET, SOCK_STREAM, 0)==-1)){ //apertura socket server perror("Error...creating socket..."); exit(-1); } servip.sin_family=AF_INET; //settaggio dominio e porta server servip.sin_port=htons((unsigned)PORT); inet_aton(LOCIP, &servip.sin_addr); //assegnazione indirizzo intero alla struttura mediante conversione servipL=clientipL=sizeof(struct sockaddr_in); //memorizzazione lunghezza indirizzo //memset((void*)&servip, 0, sizeof(servip)); if ( bind(servId, (struct sockaddr *) &servip, servipL) == -1 ) //assegnazione indirizzo server per la rete {perror("trying to bind"); exit(-2);} listen(servId, CONNECTIONS); //attesa di connessioni... while((clientId=accept(servId, (struct sockaddr *) &clientip, &clientipL)!=-1)){ //accetazione connesioni da parte di client printf("Client from %s/%d connected\n", inet_ntoa(clientip.sin_addr), ntohs(clientip.sin_port)); //stampa indirizzo e porta del client while((retcode=read(clientId, &buffer, BUFFSIZE))>0){ //ricevo byte e stampo buffer[retcode-1]='\0'; printf("Client asks: %s", buffer); buffer[retcode-1]='\n'; } close(clientId); //chiudo connessione con il client printf("%s", "Connection with client closed"); } exit(0); }
Secondo me, tra il socket e il bind deve esserci questo codice
Tu hai eliminato la memset (che comunque va prima di assegnare i valori e non dopo) ma deve esserci.codice:memset(&servip, 0, sizeof(servip)); servip.sin_family = AF_INET; servip.sin_addr.s_addr = htonl(INADDR_ANY); servip.sin_port = htons((unsigned)PORT);
No MP tecnici (non rispondo nemmeno!), usa il forum.
Quindi cosģ? Il problema permane....
codice:#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <errno.h> #include <unistd.h> #define LOCIP "127.0.0.1" #define BUFFSIZE 1024 #define PORT 2000 #define CONNECTIONS 512 int main(int argc, char * arv[]) { int servId, clientId, retcode; //ID Server, Client, contatore byte struct sockaddr_in servip, clientip; //Strutture per indirizzo ip server e client socklen_t servipL, clientipL; //lunghezza indirizzi char buffer[BUFFSIZE]; char msg[BUFFSIZE]; if((servId=socket(PF_INET, SOCK_STREAM, 0)==-1)){ //apertura socket server perror("Error...creating socket..."); exit(-1); } memset(&servip, 0, sizeof(servip)); servip.sin_family=AF_INET; //settaggio dominio e porta server servip.sin_port=htons((unsigned)PORT); inet_aton(LOCIP, &servip.sin_addr); //assegnazione indirizzo intero alla struttura mediante conversione servipL=clientipL=sizeof(struct sockaddr_in); //memorizzazione lunghezza indirizzo if ( bind(servId, (struct sockaddr *) &servip, servipL) == -1 ) //assegnazione indirizzo server per la rete {perror("trying to bind"); exit(-2);} listen(servId, CONNECTIONS); //attesa di connessioni... while((clientId=accept(servId, (struct sockaddr *) &clientip, &clientipL)!=-1)){ //accetazione connesioni da parte di client printf("Client from %s/%d connected\n", inet_ntoa(clientip.sin_addr), ntohs(clientip.sin_port)); //stampa indirizzo e porta del client while((retcode=read(clientId, &buffer, BUFFSIZE))>0){ //ricevo byte e stampo buffer[retcode-1]='\0'; printf("Client asks: %s", buffer); buffer[retcode-1]='\n'; } close(clientId); //chiudo connessione con il client printf("%s", "Connection with client closed"); } exit(0); }
Comunque provando a compilare a mano da terminale mi spunta un messaggio che lascia intendere che la memset č automatica...
codice:Server.c: In function main: Server.c:28:2: warning: incompatible implicit declaration of built-in function memset [enabled by default] dario@ubuntu:~/Scrivania$ ./Server trying to bind: Socket operation on non-socket dario@ubuntu:~/Scrivania$ ^C dario@ubuntu:~/Scrivania$
No ... cosa c'entra, come fa ad essere "automatica" la memset?
Quel messaggio si risolve se scrivi
memset((void *)&servip, 0, sizeof(servip));
Comunque
1) inserisci le linee che ti ho indicato, ma tutte, non devi eliminarne
2) elimina la lineacodice:memset((void *)&servip, 0, sizeof(servip)); servip.sin_family = AF_INET; servip.sin_addr.s_addr = htonl(INADDR_ANY); servip.sin_port = htons((unsigned)PORT);
inet_aton(LOCIP, &servip.sin_addr);
3) lascia la linea
servipL=clientipL=sizeof(struct sockaddr_in);
Quindi, il codice sarą, tra il socket e la bind
E poi occhio alle parentesi nella chiamata a socket deve esserecodice:socket ... memset((void *)&servip, 0, sizeof(servip)); servip.sin_family = AF_INET; servip.sin_addr.s_addr = htonl(INADDR_ANY); servip.sin_port = htons((unsigned)PORT); servipL=clientipL=sizeof(struct sockaddr_in); bind ...
Il problema potrebbe essere proprio questo.codice:if((servId=socket(PF_INET, SOCK_STREAM, 0))==-1) {
No MP tecnici (non rispondo nemmeno!), usa il forum.
Ok, č bastato modificare nell' apertura della socket come dicevi tu le parentesi....ora la bind funziona e nel terminale si vede il puntatore pulsante, penso sia normale visto che per ora non faccio nulla.![]()