2017-07-04 5 views
0

Ich habe Linux auf einem Gerät mit Multi-Ethernet-Ports ausgeführt und ich habe jedes von ihnen jetzt eingestellt, ich habe meine UDP-Echo-Server auf meinem Linux ausgeführt. Ich habe Pakete von der Packensender-Anwendung gesendet und sie vom selben Port zurück empfangen. Es ist wie folgt:Multi-UDP-Sockets für Multi-Ethernet-Ports

192.168.1.100

192.168.1.101

192.168.1.102

192.168.1.103 die vier Ethernet-Ports sind

Wenn ich Pakete an 192.168.1.100 senden und ich bekomme ein Echo zurück von diesem Port und wenn ich mein Netzwerk für den zweiten Port aufstelle und die Pakete an 192.168.1.101 sende, bekomme ich ein Echo von 192.168.1.100, obwohl sie an 192.168.1.101 geliefert werden und ich verstehe dass der Sockel b war Wenn ich möchte, dass mein Multiport jeden Socket an den Port gebunden hat. Was ist zu tun? Hier ist der Code für die Single-Port-Bindung des Sockets. Sollte ich select() verwenden und dieselbe Bindung mit den IP-Adressen jedes Ports ausführen, so weist der Kernel den Socket seiner Wahl zu.

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    printf("Hello World!\n"); 

    return 0; 
} 
*/ 


#include <stdio.h>  /* standard C i/o facilities */ 
#include <stdlib.h>  /* needed for atoi() */ 
#include <unistd.h>  /* defines STDIN_FILENO, system calls,etc */ 
#include <sys/types.h> /* system data type definitions */ 
#include <sys/socket.h> /* socket specific definitions */ 
#include <netinet/in.h> /* INET constants and stuff */ 
#include <arpa/inet.h> /* IP address conversion stuff */ 
#include <netdb.h>  /* gethostbyname */ 



/* this routine echos any messages (UDP datagrams) received */ 

#define MAXBUF 1024*1024 

void echo(int sd) { 
    int len,n; 
    char bufin[MAXBUF]; 
    struct sockaddr_in remote; 

    /* need to know how big address struct is, len must be set before the 
     call to recvfrom!!! */ 

    len = sizeof(remote); 

    while (1) { 
     /* read a datagram from the socket (put result in bufin) */ 
     n=recvfrom(sd,bufin,MAXBUF,0,(struct sockaddr *)&remote,&len); 

     /* print out the address of the sender */ 
     printf("Got a datagram from %s port %d\n", 
      inet_ntoa(remote.sin_addr), ntohs(remote.sin_port)); 

     if (n<0) { 
     perror("Error receiving data"); 
     } else { 
     printf("GOT %d BYTES\n",n); 
    printf("%s\n",bufin); 
     /* Got something, just send it back */ 

     sendto(sd,bufin,n,0,(struct sockaddr *)&remote,len); 
    // ClUSTERING 
     } 
    } 
} 

/* server main routine */ 

int main() { 
    int ld; 
    struct sockaddr_in skaddr; 
    int length; 

    /* create a socket 
    IP protocol family (PF_INET) 
    UDP protocol (SOCK_DGRAM) 
    */ 

    if ((ld = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { 
    printf("Problem creating socket\n"); 
    exit(1); 
    } 

    /* establish our address 
    address family is AF_INET 
    our IP address is INADDR_ANY (any of our IP addresses) 
    the port number is assigned by the kernel 
    */ 

    skaddr.sin_family = AF_INET; 
    skaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    skaddr.sin_port = htons(0); 

    if (bind(ld, (struct sockaddr *) &skaddr, sizeof(skaddr))<0) { 
    printf("Problem binding\n"); 
    exit(0); 
    } 

    /* find out what port we were assigned and print it out */ 

    length = sizeof(skaddr); 
    if (getsockname(ld, (struct sockaddr *) &skaddr, &length)<0) { 
    printf("Error getsockname\n"); 
    exit(1); 
    } 

    /* port number's are network byte order, we have to convert to 
    host byte order before printing ! 
    */ 
    printf("The server UDP port number is %d\n",ntohs(skaddr.sin_port)); 

    /* Go echo every datagram we get */ 
    echo(ld); 
    return(0); 
} 

Antwort

0

Sie haben Ihren Socket an INADDR_ANY gebunden, was eine beliebige IP-Adresse bedeutet. Wenn das nicht gewünscht ist, binden Sie es an eine bestimmte IP-Adresse. Aber so brauchen Sie mehrere Sockets. So wie du es jetzt hast, tust du es nicht.

+0

Ja, jetzt habe ich an bestimmte Adressen binden, das ist in Ordnung ... aber jetzt wie kann ich zwei Ports gleichzeitig behandeln? um Pakete gleichzeitig zu empfangen. – jenny

+0

Entweder in separaten Threads oder im nicht-blockierenden Modus mit 'select()'. – EJP

+0

Oh yaa, separate Threads sind meiner Wahl, denke ich, weil ich Daten in beiden Ports gleichzeitig empfangen möchte – jenny

Verwandte Themen