Προς το περιεχόμενο

HEEEELP me...Δίκτυα και sockets στην C...


Anonymous

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια παιδιά!Καλή χρονιά να'χουμε!Έχω ένα πρόβλημα...Προσπαθώ εδώ και μερικές μέρες να φτιάξω έναν Server και έναν Client σε Linux και δεν ξέρω γιατί δεν συνδέονται...Παρακάτω σας δίνω τον κώδικα που έφτιαξα για τον Server:

 

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <strings.h>

#include <netdb.h>

#include <stdio.h>

main()

{

int sock,connfd;

socklen_t len;

struct sockaddr_in servaddr,cliaddr;

 

sock=socket(AF_INET,SOCK_STREAM,0);

bzero((char*)&servaddr,sizeof(servaddr));

servaddr.sin_family=AF_INET;

servaddr.sin_port=htons(9000);

servaddr.sin_addr.s_addr=htonl(127.0.0.1);

bind(sock,(struct sockaddr_in *) &servaddr,sizeof(servaddr));

listen(sock,10);

 

for( ; ; )

{

len=sizeof(cliaddr);

connfd=accept(sock,(struct sockaddr_in *) &servaddr,sizeof(servaddr));

printf("Syndethike!!!");

close(connfd);

}

}

 

Ανοίγω μετά μια κονσόλα(command line) και κάνω gcc το πρόγραμμα,οπότε δημιουργείται ένα a.out αρχείο.Παρακάτω παραθέτω τα warnings που δημιουργούνται κατά το compile...

 

Server.c:19:40: too many decimal points in number

Server.c: In function `main':

Server.c:20: warning: passing arg 2 of `bind' from incompatible pointer type

Server.c:26: warning: passing arg 2 of `accept' from incompatible pointer type

Server.c:26: warning: passing arg 3 of `accept' makes pointer from integer without a cast

 

Πατάω a.out στην κονσόλα του Linux και τρέχει ο Server περιμένοντας μια αίτηση για σύνδεση από έναν client.Έπειτα κάνω compile τον client,που έχω φτιάξει,του οποίου τον κώδικα παραθέτω παρακάτω:

 

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <strings.h>

#include <netdb.h>

#include <stdio.h>

 

main(int argc,char **argv)

{

int sock,z,l;

struct sockaddr_in servaddr;

 

if(argc!=2)

printf("error");

 

sock=socket(AF_INET,SOCK_STREAM,0);

bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family=AF_INET;

 

servaddr.sin_port=htons(9000);

printf("%s\n",argv[1]);

l=inet_pton(AF_INET,argv[1],&servaddr.sin_addr);

printf("%d\n",l);

z=connect(sock,(struct sockaddr *) &servaddr,sizeof(servaddr));

printf("%d",z);

 

exit(0);

}

 

Στο compile του client δεν δημιουργείται ούτε error ούτε warning...Δημιουργείται ένα a.out αρχείο το οποίο το τρέχω στην κονσόλα με τον εξής τρόπο: "a.out 127.0.0.1" (χωρίς τα "αυτάκια" εννοείται... ;) ). Το αποτέλεσμα είναι πάντα το ίδιο,ποτέ δεν συνδέεται ο client στον Server...Όποιος μπορεί ρε παιδιά ας με βοηθήσει γιατί έχω τρελαθεί...Μήπως πρέπει να βάλω κάποιο πακέτο του Linux στο σύστημά μου για να δουλέψει;Σας παρακαλώ HELP me...

 

Ευχαριστώ εκ των προτέρων (συγνώμη αν σας κούρασα) και καλή χρονιά να έχουμε όλοι μας...

Δημοσ.

Sta grigora epeidi den prolabaino sou episimaino ta e3is lathi

 

sto serv.c

servaddr.sin_addr.s_addr=htonl(127.0.0.1);

auto einai lathos kai sto leei kai to warning. Thes to e3is

servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");

 

Episis den prose3es ypopsiazomai otan diabazes gia unix sockets to e3is

 

yparxei to struct sockaddr kai to struct sockaddr_in. Ta dyo exoun idio megethos kai kratan tin idia pliroforia alla exoun diaforetika meli. Etsi to

 

bind(sock,(struct sockaddr_in *) &servaddr,sizeof(servaddr));

 

einai lathos . To cast sto 2o argument einai

 

(struct sockaddr *) giati auto einai to argument pou zitaei i sinartisi . Sto elegan kai ta warnings. Ean thes na deis to prototypo tis sinartisis kane apla man bind. To idio lathos exeis kanei pantou ston server. O client deixnei mallon sostos. Episis gia dokimes min dokimazeis me ton client gia na deis an o server sou douleuei. Protimise to telnet efoson o server sou einai toso aplos. telnet localhost 9000. Telos kaneis 2 fores include tin sys/socket.h se kathe programma.

 

Sou dino ena sxetika aplo kai oxi plires sxediagramma enos server pou ekana copy paste apo ena palio mou programma. Ean thes kane mou ena pm na sou steilo pliri kodika gia server kai client gia ena aplo chatting programma.

 

int chatd ()

{

struct sockaddr_in serv_addr,client_addr;

int soc_tcp,soc_len,soc_cli;

 

/*Socketing*/

if ( (soc_tcp=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) <0) {

fprintf(stderr,"Could not create socket\n");

perror(NULL);

exit(0);

}

 

/*Binding socket */

bzero( &serv_addr, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

#serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

serv_addr.sin_addr.s_addr = inet_addr ("127.0.0.1");

serv_addr.sin_port = htons(PORT);

if ( bind(soc_tcp, (struct sockaddr *) &serv_addr,

sizeof(serv_addr)) !=0 ) {

fprintf(stderr,"Could not bind socket\n");

perror(NULL);

exit(-1);

}

/*Listening from socket*/

if ( listen(soc_tcp,NUMLISTENS) !=0 ) {

fprintf(stderr,"Could not listen\n");

exit(0);

}

soc_len = sizeof(client_addr);

while (1) {

printf("Server ready for requests\n");

 

soc_cli = accept(soc_tcp, (struct sockaddr *) &client_addr,

&soc_len);

if (soc_cli <0) {

fprintf(stderr,"Could not accept\n");

continue;

}

 

PS: kali xronia

  • 3 χρόνια αργότερα...
Δημοσ.
Γεια παιδιά!Καλή χρονιά να'χουμε!Έχω ένα πρόβλημα...Προσπαθώ εδώ και μερικές μέρες να φτιάξω έναν Server και έναν Client σε Linux και δεν ξέρω γιατί δεν συνδέονται...Παρακάτω σας δίνω τον κώδικα που έφτιαξα για τον Server:

 

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <strings.h>

#include <netdb.h>

#include <stdio.h>

main()

{

int sock,connfd;

socklen_t len;

struct sockaddr_in servaddr,cliaddr;

 

sock=socket(AF_INET,SOCK_STREAM,0);

bzero((char*)&servaddr,sizeof(servaddr));

servaddr.sin_family=AF_INET;

servaddr.sin_port=htons(9000);

servaddr.sin_addr.s_addr=htonl(127.0.0.1);

bind(sock,(struct sockaddr_in *) &servaddr,sizeof(servaddr));

listen(sock,10);

 

for( ; ; )

{

len=sizeof(cliaddr);

connfd=accept(sock,(struct sockaddr_in *) &servaddr,sizeof(servaddr));

printf("Syndethike!!!");

close(connfd);

}

}

 

Ανοίγω μετά μια κονσόλα(command line) και κάνω gcc το πρόγραμμα,οπότε δημιουργείται ένα a.out αρχείο.Παρακάτω παραθέτω τα warnings που δημιουργούνται κατά το compile...

 

Server.c:19:40: too many decimal points in number

Server.c: In function `main':

Server.c:20: warning: passing arg 2 of `bind' from incompatible pointer type

Server.c:26: warning: passing arg 2 of `accept' from incompatible pointer type

Server.c:26: warning: passing arg 3 of `accept' makes pointer from integer without a cast

 

Πατάω a.out στην κονσόλα του Linux και τρέχει ο Server περιμένοντας μια αίτηση για σύνδεση από έναν client.Έπειτα κάνω compile τον client,που έχω φτιάξει,του οποίου τον κώδικα παραθέτω παρακάτω:

 

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <strings.h>

#include <netdb.h>

#include <stdio.h>

 

main(int argc,char **argv)

{

int sock,z,l;

struct sockaddr_in servaddr;

 

if(argc!=2)

printf("error");

 

sock=socket(AF_INET,SOCK_STREAM,0);

bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family=AF_INET;

 

servaddr.sin_port=htons(9000);

printf("%s\n",argv[1]);

l=inet_pton(AF_INET,argv[1],&servaddr.sin_addr);

printf("%d\n",l);

z=connect(sock,(struct sockaddr *) &servaddr,sizeof(servaddr));

printf("%d",z);

 

exit(0);

}

 

Στο compile του client δεν δημιουργείται ούτε error ούτε warning...Δημιουργείται ένα a.out αρχείο το οποίο το τρέχω στην κονσόλα με τον εξής τρόπο: "a.out 127.0.0.1" (χωρίς τα "αυτάκια" εννοείται... ;) ). Το αποτέλεσμα είναι πάντα το ίδιο,ποτέ δεν συνδέεται ο client στον Server...Όποιος μπορεί ρε παιδιά ας με βοηθήσει γιατί έχω τρελαθεί...Μήπως πρέπει να βάλω κάποιο πακέτο του Linux στο σύστημά μου για να δουλέψει;Σας παρακαλώ HELP me...

 

Ευχαριστώ εκ των προτέρων (συγνώμη αν σας κούρασα) και καλή χρονιά να έχουμε όλοι μας...

 

bind(sock,(struct sockaddr_in *) &servaddr,sizeof(servaddr));

edw grafeis (sockaddr*)&servaddr sthn deuterh parametro

episis prin kanei accept to server prepei na kanei listen

sto accept to idio cast opos egrapsa proigoumenos

dn eida to client alla an to grapses swsta tote prepei na syndethoun :)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...