2017-03-09 3 views
0

Ich experimentiere mit dem Senden einer Nachricht von einem Server an einen Client mit UDP-Sockets ... mein Client empfängt jedoch keine Nachrichten. Jede Rückmeldung würde sehr geschätzt werden!Eine UDP-Nachricht vom Server an den Client senden

EDIT: vielleicht sollte ich klarstellen, dass die Nachricht scheint erfolgreich zu senden, aber wenn ich den Client laufen wird es auf warten auf Daten stecken ... irgendwelche Hinweise, warum dies passiert wäre geschätzt!

UDP SERVER

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#include<arpa/inet.h> 
#include<sys/socket.h> 

#define SERVER "127.0.0.1" 
#define BUFLEN 512 //Max length of buffer 
#define PORT 8888 //The port on which to listen for incoming data 

void die(char *s) 
{ 
    perror(s); 
    exit(1); 
} 

int main(void) 
{ 
    struct sockaddr_in si_other; 

    int s, i, slen = sizeof(si_other); 
    char buf[BUFLEN]; 
    char message[BUFLEN]; 
    //create a UDP socket 
    if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) 
    { 
     die("socket"); 
    } 

    // zero out the structure 
    memset((char *) &si_other, 0, sizeof(si_other)); 
    si_other.sin_family = AF_INET; 
    si_other.sin_port = htons(PORT); 

    if (inet_aton(SERVER , &si_other.sin_addr) == 0) 
    { 
     fprintf(stderr, "inet_aton() failed\n"); 
     exit(1); 
    } 

    //bind socket to port 
    if(bind(s , (struct sockaddr*)&si_other, sizeof(si_other)) == -1) 
    { 
     die("bind"); 
    } 
    else 
    { 
     printf ("Success!\n"); 
    } 


    while(1) 
    { 
     printf("Enter message : "); 
     gets(message); 

     //send the message 
     if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen)==-1) 
     { 
      die("sendto()"); 
     } 
     else 
     { 
      printf ("Success!\n"); 
     } 

    } 

    close(s); 
    return 0; 
} 

UDP-Client

#include<stdio.h> //printf 
#include<string.h> //memset 
#include<stdlib.h> //exit(0); 
#include<arpa/inet.h> 
#include<sys/socket.h> 


#define BUFLEN 512 //Max length of buffer 
#define PORT 8888 //The port on which to send data 

void die(char *s) 
{ 
    perror(s); 
    exit(1); 
} 

int main(void) 
{ 
    struct sockaddr_in si_me, si_other; 
    int s, i, slen=sizeof(si_other), recv_len; 
    char buf[BUFLEN]; 
    char message[BUFLEN]; 

    if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) 
    { 
     die("socket"); 
    } 

    // zero out the structure 
    memset((char *) &si_me, 0, sizeof(si_me)); 

    si_me.sin_family = AF_INET; 
    si_me.sin_port = htons(PORT); 
    si_me.sin_addr.s_addr = htonl(INADDR_ANY); 

    while(1) 
    { 
     printf("Waiting for data..."); 
     fflush(stdout); 

     //try to receive some data, this is a blocking call 
     if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == -1) 
     { 
      die("recvfrom()"); 
     } 

     //print details of the client/peer and the data received 
     printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port)); 
     printf("Data: %s\n" , buf);   
    } 

    close(s); 
    return 0; 
} 
+0

'int s, ich, slen = sizeof (si_other), recv_len;': was bin ich? Versuchen Sie: 'socklen_t slen;' und 'slen = sizeof si_other' – jhscheer

+0

Ich habe es geschafft zu arbeiten ... Ich muss Bind() vom Client anrufen und nicht den Server ... – user1816546

+0

Schreiben Sie das als Antwort dann (Sie dürfen Ihre eigenen Fragen beantworten) und akzeptieren Sie es dann. – JeremyP

Antwort

0

Aufruf bind() vom Client und der Server

+0

Da Sie 'SOCK_DGRAM' verwenden, müssen Sie' bind() 'überhaupt nicht aufrufen. http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#sendtorecv – jhscheer

+0

ohne Aufruf binden, das Programm funktioniert nicht ... – user1816546

+0

http://stackoverflow.com/questions/8636717/is- it-always-required-to-bind-a-socket – jhscheer

0

Sie benötigen, um Ihre Kunden zu binden, nicht Ihre Server.

+0

Dies wurde bereits vom OP gepostet. –

Verwandte Themen