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

UDP socket help lang:C


psalias

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

Δημοσ.

Καλησπέρα παιδιά θέλω την βοήθεια σας για ένα κώδικα σε 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, κάτι πρέπει να παίζει με την σύνταξη

Δημοσ.

Τόσο ο κώδικας του client όσο και του server ειναι λανθασμένα σχεδιασμένos διότι η φιλοσοφία της επικοινωνίας με udp πρωτόκολλο είναι χωρίς σύνδεση των δυο "άκρων" (no point to point connection), και γιαυτό δεν εγγυάται την ασφαλή μεταφορά των δεδομένων που εξασφαλίζει το tcp. Ένας udp server δεν περιμένει συνδέσεις (accept connections) , και ένας udp client δεν συνδέεται (connect) στον server. Τροποποίησε τον κώδικα σου σύμφωνα με τα παραπάνω. Ψάξε και για κανένα παράδειγμα στο google.

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

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

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