Die Bindung an eine bestimmte IP-Adresse und port für den Empfang von UDP-Daten

Ich versuche, empfangen von UDP-Daten, die broadcast-Netzwerk-Adresse 192.168.103.255 port 3000 durch PlayCap (http://www.signal11.us/oss/playcap/). Ich habe Probleme bei der Bindung an diese Adresse und port. Hier ist mein Java-code:

public static void main(String[] args) {
    try {
        DatagramSocket s = new DatagramSocket();
        InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
        s.bind(address);

        byte buffer[] = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        System.out.println("Waiting...");
        s.receive(packet);
        System.out.println("Received!");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Dieser gibt den Fehler zurück:

java.net.SocketException: already bound
    at java.net.DatagramSocket.bind(Unknown Source)
    at runner.main(runner.java:12)

Ich haben, führen Sie den Befehl "netstat-a -n", und weder Adresse 192.168.103.255 noch port 3000 aufgeführt sind überall in den Ausgang, so denke ich nicht, dass dieser port ist bereits in Verwendung. In der Tat, ich bekomme diese Fehlermeldung bei jeder Adresse/port-Kombination, die ich versuche (einschließlich meiner statischen IP-Adresse).

Schrieb ich auch einige C-code, um ein socket und bind Sie an diese Adresse und port, aber es auch nicht auf den bind-Aufruf. Mit diesem code, jedoch wird die Bindung an die ports auf meine statische IP-Adresse (192.168.1.149). Hier der betreffende code:

#include <stdio.h>
#include <sys/types.h>
#include <winsock.h>
#include <unistd.h>

#define a1 192
#define a2 168
#define a3 103
#define a4 255
#define PORT 3000

int main() {

    /* Open windows connection */
    WSADATA w;
    if (WSAStartup(0x0101, &w) != 0)
    {
        printf("Could not open Windows connection.\n");
        exit(0);
    }

    /* Clear out server struct */
    SOCKADDR_IN server;
    memset((void *)&server, '\0', sizeof(struct sockaddr_in));

    /* Set family and port */
    server.sin_family = AF_INET;
    server.sin_port = htons(PORT);
    server.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)a1;
    server.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)a2;
    server.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)a3;
    server.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)a4;

    /* Open a datagram socket */
    int sd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sd == INVALID_SOCKET)
    {
        printf("Could not create socket.\n");
        WSACleanup();
        exit(0);
    }

    /* Bind address to socket */
    if (bind(sd, (struct sockaddr *)&server, sizeof(SOCKADDR_IN)) == -1)
    {
        printf("Could not bind name to socket.\n");
        closesocket(sd);
        WSACleanup();
        exit(0);
    }

    /* Receive */
    char data[1024];
    printf("Waiting to receive...\n");
    if (recv(sd, (char *)&data, (int)sizeof(data), 0))
    {
        printf("Error receiving data.\n");
        closesocket(sd);
        WSACleanup();
        exit(0);
    }

    printf("Data: %s", data);

    return 0;
}

Ich bin mit einem Windows 7-Maschine. Ich bin mit den Java-code in Eclipse. Ich bin das kompilieren der C-code mit MinGW mit dem Befehl:

gcc a.c -lws2_32

("ein.c" ist der name der Datei).

Während der Java-code ist mehr wichtig, ich würde gerne wissen, wohin ich gehe falsch in meinem code-Beispiele. Alle Vorschläge werden sehr geschätzt.

  • Was sind die Win32-Fehler? Warum statische IP?
  • warum sagen Sie "broadcast" und dann statische IP??
InformationsquelleAutor ajlitzau13 | 2012-11-26
Schreibe einen Kommentar