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??
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese für Ihre Java-code anstatt:
Aufruf des no-arg-Konstruktor für einen datagram-socket dazu, dass es zum binden an einen beliebigen, freien port. Einmal gebunden, weitere versuche zu (re)bind werfen wird eine socket-exception (mit der Fehlermeldung, die Sie waren zu sehen). Auf 'defer' Bindung, Sie statt dessen datagram-socket in einem ungebundenen Zustand (durch die übergabe eines null im Konstruktor), dann ruft
bind
später auf.Euch nicht zu binden an die broadcast-Adresse zu empfangen, die broadcast-Pakete. Nur das binden an den port und die Adresse
INADDR_ANY
(sorry, nicht sicher, wie Sie Sie zum Ausdruck bringen, dass in Java) und Sie erhalten die Pakete an diesen port an die broadcast-Adresse.Es scheint, dass das Datagramm Konstruktor die port-Nummer binden. Hoffe, dass geholfen...