2017-02-28 3 views
0

Wie kann ich verschiedene Maschinen verwenden, um Nachrichten mit dem UPD-Client und -Server zu senden? Ich verstehe, dass ich diese beiden auf der gleichen Maschine verwenden muss, nur muss ich sie kompilieren und Nachrichten durchlaufen. Aber mit verschiedenen Maschinen wie?UPD-Client und UDP-Server

Dieser Code ist für den UDP-Client.

/* 
Simple udp client 
Silver Moon ([email protected]) 
*/ 
#include<stdio.h> //printf 
#include<string.h> //memset 
#include<stdlib.h> //exit(0); 
#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 send 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]; 

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

    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); 
    } 

    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()"); 
      } 

      //receive a reply and print it 
      //clear the buffer by filling null, it might have previously received data 
      memset(buf,'\0', BUFLEN); 
      //try to receive some data, this is a blocking call 
      if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == -1) 
      { 
      die("recvfrom()"); 
      } 

      puts(buf); 
    } 

    close(s); 
    return 0; 
} 

Dieser Code ist für den UDP-Server.

/* Simple udp server 
Silver Moon ([email protected]) */ 
#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 listen for incoming 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]; 

    //create a UDP socket 
    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); 

    //bind socket to port 
    if(bind(s , (struct sockaddr*)&si_me, sizeof(si_me)) == -1) 
    { 
      die("bind"); 
    } 

    //keep listening for data 
    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); 

      //now reply the client with the same data 
      if (sendto(s, buf, recv_len, 0, (struct sockaddr*) &si_other, slen) == -1) 
      { 
        die("sendto()"); 
      } 
    } 

    close(s); 
    return 0; 
} 
+1

Im Client-Code müssen Sie die IP-Adresse des Computers festlegen, auf dem der Server ausgeführt wird. Ihr Server sieht so aus, als ob er in Ordnung sein sollte. –

+0

Sagen Sie so etwas: ./udpclient Server 127.0.0.1? –

+0

Hilfe, ich weiß nicht, wie ich es einrichten soll. –

Antwort

0

127.0.0.1 ist eine lokale IP-Adresse (zugewiesen Schnittstelle unter IP sehen Loopback für lo0 Schnittstelle). Es eignet sich für die Kommunikation über Differenzprozesse, die in Client-Serverrollen auf demselben Host/System ausgeführt werden.

Was Sie brauchen, ist die zugewiesene IP der primären Schnittstelle (wie eth0/en0 usw.) auf Ihrem Serversystem. Auf einem MAC sieht das wie unten

#ifconfig -au 
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 
    .. 
    inet 127.0.0.1 netmask 0xff000000 
    nd6 options=1<PERFORMNUD> 
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
    .. 
    inet 192.168.1.2 netmask 0xffffff00 broadcast 192.168.1.255 
    nd6 options=1<PERFORMNUD> 
    media: autoselect 
    status: active 

In der obigen Ausgabe ich die IP-Adresse auf en0 die 192.168.1.2 ist verwenden würde (für den Server zu binden), und dann können die Kunden an diese IP-Verbindung über das Netzwerk.

+0

Ich verstehe das nicht. Wie hast du angefangen, alles zu kompilieren? Entschuldigung, ich bin neu in diesem Bereich. –

+0

Sie machen bereits eine Bindung auf INADDR_ANY auf dem Server si_me.sin_addr.s_addr = htonl (INADDR_ANY); Sie sollten also in der Lage sein, eine Verbindung herzustellen, indem Sie auf Ihrer Client-Seite eine IP-Adresse des Servers (nicht 127.0.0.1) angeben, um eine Verbindung über das Netzwerk herzustellen. –

+0

Wie? Angenommen, meine IP-Adresse lautet 123.4.5.6. Muss ich wie ./udpserver localhost 123.4.5.6 schreiben? Ich benutze einen Mac und habe eine andere Maschine, die Windows ist. Ich möchte Nachrichten von Mac an Windows senden oder umgekehrt. –