PDA

View Full Version : [C] socket non funziona


white05
30-01-2010, 17:47
Ragazzi sono alle prime esperienze con la socket, ho creato semplicemente un client e un server che devono scriversi qualche frase e premetto che ho seguito alla lettera il codice e l'esempio della guida ma non funziona

il codice del server è
/* Creazione del Server */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>

#define PORT 4000
#define CONNMAX 10

int main(){

int sock,newsock;
struct sockaddr_in server;
char buffer[100];

/*creiamo la socket e memorizziamo in sock il descriptor*/
if((sock=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket");
exit(1);
} else {
printf("Socket creata\n");
}

/*assegniamo indirizzo e porta mediante bind*/
server.sin_family=AF_INET;
server.sin_addr.s_addr= INADDR_ANY;
server.sin_port = htons(PORT);

bind(sock,(struct sockaddr*) &server,sizeof(server));

/*la socket si pone in ascolto*/
if(listen(sock,CONNMAX)<0){
perror("listen");
exit(1);
} else {
printf("socket in ascolto\n");
}

/*la socket accetta la richiesta di connessione dal Client*/
if (newsock=accept(sock,NULL,NULL)<0){
perror("accept");
exit(1);
} else { printf("Server: connessione accettata\n");
}

write(newsock,"sono il server",sizeof("sono il server"));


return 0;
}

in pratica il socekt scrive la frase "sono il server" su se stesso e non sul client!!!!! :mbe:
Quando eseguo il client mi risulta la frase "Server: connessione accettata" quindi deduco che la connessione è avvenuta, e allora perché succede tutto ciò??
Spero possiate aiutarmi

clockover
31-01-2010, 00:17
Allora guarda il problema è che a newsock viene assegnato il descrittore 0, che di default è lo standard output! Puoi verificarlo da solo mettendo una printf("Descrittore newsock --> %d\n", newsock); prima della write

puoi ovviare a questo problema in questo modo


newsock=accept(sock,NULL, NULL);
if (newsock<0){
perror("accept");
exit(1);
} else { printf("Server: connessione accettata\n");
}
//printf("Descrittore numero %d\n", newsock);
write(newsock,"sono il server",sizeof("sono il server"));