2012-11-26 16 views
9

मैं यूडीपी डेटा प्राप्त करने की कोशिश कर रहा हूं जो नेटवर्क पते पर प्रसारित किया जा रहा है 192.168.103.255 पोर्ट 3000 प्लेकैप (http://www.signal11.us/oss/playcap/) द्वारा। मुझे इस पते और बंदरगाह पर बाध्यकारी समस्याएं आ रही हैं।यूडीपी डेटा प्राप्त करने के लिए एक विशिष्ट आईपी पते और बंदरगाह के लिए बाध्यकारी

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

इस त्रुटि देता है: यहाँ मेरी जावा कोड है

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

मैं कमांड "netstat -एक -n" समाप्त हो गया है, और न तो पता है और न ही 192.168.103.255 पोर्ट 3000 में कहीं भी सूचीबद्ध हैं आउटपुट, इसलिए मुझे नहीं लगता कि यह बंदरगाह पहले से ही उपयोग में है। असल में, मुझे यह त्रुटि किसी भी पते/पोर्ट संयोजन के लिए मिलती है जो मैं कोशिश करता हूं (मेरे स्थिर आईपी पते सहित)।

मैंने सॉकेट बनाने और इस पते और बंदरगाह से बांधने के लिए कुछ सी कोड भी लिखा, लेकिन यह बाध्य कॉल पर भी विफल रहता है। हालांकि, यह कोड मेरे स्थिर आईपी पते (1 9 2.168.1.149) पर बंदरगाहों से जुड़ जाएगा। यहां वह कोड है:

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

मैं विंडोज 7 मशीन का उपयोग कर रहा हूं। मैं एक्लिप्स में जावा कोड चला रहा हूं। मैं MinGW आदेश का उपयोग कर के साथ सी कोड संकलन कर रहा हूँ:

gcc a.c -lws2_32 

("a.c" फ़ाइल नाम है)।

जबकि जावा कोड अधिक महत्वपूर्ण है, मुझे यह जानकर ख़ुशी होगी कि मेरे कोड उदाहरणों में से मैं गलत कहां जा रहा हूं। किसी भी सुझाव की बहुत सराहना की जाती है।

+0

Win32 त्रुटियां क्या हैं? स्थिर आईपी क्यों? –

+0

आप "प्रसारण" क्यों कह रहे हैं और फिर स्थिर आईपी ?? –

उत्तर

12

बजाय अपने जावा कोड के लिए इस प्रयास करें:

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

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

एक आंकड़ारेख सॉकेट के लिए कोई आर्ग निर्माता कॉलिंग यह एक यादृच्छिक, उपलब्ध बंदरगाह के लिए बाध्य करने के लिए कारण होगा। एक बार बाध्य होने के बाद, बाध्य करने के लिए और प्रयास एक सॉकेट अपवाद फेंक देंगे (जिस त्रुटि को आप देख रहे थे)। बाइंडिंग को 'स्थगित' करने के लिए, आप इसके बजाय एक अनबाउंड स्थिति में डेटाग्राम सॉकेट (कन्स्ट्रक्टर में एक नल गुजरकर) बनाते हैं, फिर बाद में bind पर कॉल करते हैं।

+0

यह त्रुटि प्राप्त करना: java.net.BindException: अनुरोधित पता असाइन नहीं कर सकता: java.net पर \t बाध्य नहीं कर सकता। DualStackPlainDatagramSocketImpl।socketBind (मूल निवासी विधि) \t java.net.DualStackPlainDatagramSocketImpl.bind0 (अज्ञात स्रोत) \t java.net.AbstractPlainDatagramSocketImpl.bind पर (अज्ञात स्रोत) \t java.net.DatagramSocket.bind पर (अज्ञात स्रोत) पर \t पर runner.main (runner.java:11) – ajlitzau13

+0

@ ajlitzau13: मेरा जवाब बताता है * क्यों * वह है। –

+0

आईपीवी 6 मुद्दों को खत्म करने के लिए अपने डिफ़ॉल्ट इंटरफ़ेस पर बाध्यकारी आज़माएं (इंटरनेट पता हटाएं और पोर्ट का उपयोग करें)। – Perception

4

आप ब्रॉडकास्ट पैकेट प्राप्त करने के लिए प्रसारण पते से बाध्य नहीं हैं। बस पोर्ट और पते INADDR_ANY से संपर्क करें (क्षमा करें, जावा में इसे व्यक्त करने के लिए सुनिश्चित नहीं है) और आपको प्रसारण पते पर उस पोर्ट पर पैकेट मिलेगा।

+0

यहां सुनवाई कहां है ?? -1 के करीब ... –

+0

@ किरीलकोबेलेव: मुझे लगता है कि "एक बंदरगाह/पता पर सुनें" को किसी विशेष पते पर बाध्यकारी माना जाता है, लेकिन मैंने शब्द को स्पष्ट किया। –

+0

अब यह बेहतर लगता है। –

0

यह appears that डेटाग्राम कन्स्ट्रक्टर पोर्ट नंबर को बांधने के लिए लेता है। उम्मीद है कि मदद की ...

संबंधित मुद्दे