psalias Δημοσ. 16 Νοεμβρίου 2008 Δημοσ. 16 Νοεμβρίου 2008 Καλησπέρα παιδιά θέλω την βοήθεια σας για ένα κώδικα σε C. Φτιάχνω ένα server και client που θα μιλάνε πάνω σε UDP UDPserver >/* udpserver.c */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <stdlib.h> int main() { int sock,addr_len, connected, bytes_recieved , true = 1; char send_data [1024] , recv_data[1024]; struct sockaddr_in server_addr,client_addr; int sin_size; if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("Socket"); exit(1); } if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) { perror("Setsockopt"); exit(1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(5000); server_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server_addr.sin_zero),8); if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))== -1) { perror("Unable to bind"); exit(1); } addr_len = sizeof(struct sockaddr); printf("\nUDPServer Waiting for client on port 5000"); fflush(stdout); while(1) { sin_size = sizeof(struct sockaddr_in); connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size); printf("\n I got a connection from (%s , %d)", inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port)); while (1) { printf("\n SEND (q or Q to quit) : "); gets(send_data); if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0) { sendto(sock, send_data, strlen(send_data), 0,(struct sockaddr *)&server_addr, sizeof(struct sockaddr)); close(connected); break; } else sendto(sock, send_data, strlen(send_data), 0,(struct sockaddr *)&server_addr, sizeof(struct sockaddr)); bytes_recieved = recvfrom(sock,recv_data,1024,0,(struct sockaddr *)&client_addr, &addr_len); recv_data[bytes_recieved] = '\0'; if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) { close(connected); break; } else printf("\n RECIEVED DATA = %s " , recv_data); fflush(stdout); } } close(sock); return 0; } UDP client > #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <stdlib.h> int main() { int sock, bytes_recieved,addr_len,client_addr; char send_data[1024],recv_data[1024]; struct hostent *host; struct sockaddr_in server_addr; host = gethostbyname("127.0.0.1"); if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(5000); server_addr.sin_addr = *((struct in_addr *)host->h_addr); bzero(&(server_addr.sin_zero),8); if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { perror("Connect"); exit(1); } while(1) { bytes_recieved=recvfrom(sock,recv_data,1024,0, (struct sockaddr *)&client_addr, &addr_len); if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) { close(sock); break; } else printf("\nRecieved data = %s " , recv_data); printf("\nSEND (q or Q to quit) : "); gets(send_data); if (strcmp(send_data , "q") != 0 && strcmp(send_data , "Q") != 0) sendto(sock, send_data, strlen(send_data), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); else { sendto(sock, send_data, strlen(send_data), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); close(sock); break; } } return 0; } Διόρθωσα το πρώτο λάθος μου δηλαδή άλλαξα το send και το recv με sendto και recvfrom αντίστοιχα, αλλα ξανά έχω πρόβλημα με τον server, όταν γράφω κάτι δεν το εμφανίζει στον client αλλα το εμφανίζει στον εαυτό του, και επίσης ο client δεν παίρνει ούτε στέλνει τίποτα στον server, νομίζω ότι το πρόβλημα είναι στις sendto και στην recvfrom, κάτι πρέπει να παίζει με την σύνταξη
pinball_elf Δημοσ. 20 Νοεμβρίου 2008 Δημοσ. 20 Νοεμβρίου 2008 Τόσο ο κώδικας του client όσο και του server ειναι λανθασμένα σχεδιασμένos διότι η φιλοσοφία της επικοινωνίας με udp πρωτόκολλο είναι χωρίς σύνδεση των δυο "άκρων" (no point to point connection), και γιαυτό δεν εγγυάται την ασφαλή μεταφορά των δεδομένων που εξασφαλίζει το tcp. Ένας udp server δεν περιμένει συνδέσεις (accept connections) , και ένας udp client δεν συνδέεται (connect) στον server. Τροποποίησε τον κώδικα σου σύμφωνα με τα παραπάνω. Ψάξε και για κανένα παράδειγμα στο google.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.