2014-05-18 5 views
6

मैं उसी सॉकेट पर पैकेट भेजना और प्राप्त करना चाहता हूं, क्या यह संभव है या मुझे दो सॉकेट बनाना है, एक भेजने के लिए और एक प्राप्त करने के लिए? यदि हां, तो क्या आप मुझे एक उदाहरण दे सकते हैं?सी - udp उसी सॉकेट पर भेजें और प्राप्त करें

एक और सवाल: मैं प्राप्त पैकेट से स्रोत आईपी कैसे प्राप्त कर सकता हूं?

संपादित करें (कोड उदाहरण):

int main(void) { 
    struct sockaddr_in si_me, si_other; 
    int s, i, slen=sizeof(si_other); 
    char buf[BUFLEN]; 

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

    memset((char *) &si_me, 0, sizeof(si_me)); 
    si_me.sin_family = AF_INET; 
    si_me.sin_port = htons(1234); 
    si_me.sin_addr.s_addr = htonl(192.168.1.1); 

    if (bind(s, &si_me, sizeof(si_me))==-1) 
     die("bind"); 

    if (recvfrom(s, buf, BUFLEN, 0, &si_other, &slen)==-1) 
     diep("recvfrom()"); 
    printf("Data: %s \nReceived from %s:%d\n\n", buf, inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port)); 

    //now I want the server to answer back to the client 

    close(s); 
    return 0; 
} 

उत्तर

12

हाँ, आप एक ही सॉकेट भेजने और प्राप्त करने के लिए उपयोग कर सकते हैं। recvfrom() आपको प्रेषक का आईपी/पोर्ट बताता है। सीधे शब्दों में sendto() कि आईपी/पोर्ट एक ही सॉकेट कि आप recvfrom() साथ उपयोग करते हैं, उदाहरण के लिए उपयोग कर रहा:

int main(void) { 
    struct sockaddr_in si_me, si_other; 
    int s, i, blen, slen = sizeof(si_other); 
    char buf[BUFLEN]; 

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

    memset((char *) &si_me, 0, sizeof(si_me)); 
    si_me.sin_family = AF_INET; 
    si_me.sin_port = htons(1234); 
    si_me.sin_addr.s_addr = htonl(192.168.1.1); 

    if (bind(s, (struct sockaddr*) &si_me, sizeof(si_me))==-1) 
     die("bind"); 

    int blen = recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr*) &si_other, &slen); 
    if (blen == -1) 
     diep("recvfrom()"); 

    printf("Data: %.*s \nReceived from %s:%d\n\n", blen, buf, inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port)); 

    //send answer back to the client 
    if (sendto(s, buf, blen, 0, (struct sockaddr*) &si_other, slen) == -1) 
     diep("sendto()"); 

    close(s); 
    return 0; 
} 
+0

आपको एक उदाहरण पोस्ट कृपया कर सकते हैं? – user3574984

+0

क्या? भेजने/प्राप्त? या स्रोत आईपी/पोर्ट प्राप्त कर रहे हैं? यदि आप चारों ओर देखते हैं तो ऑनलाइन दोनों के बहुत सारे उदाहरण हैं। –

+0

सर्वर एक पैकेट => एक ही udp सॉकेट पर जवाब देता है ... मुझे पता है कि कैसे प्राप्त करें और कैसे भेजना है, लेकिन एक ही सॉकेट के साथ इसे कैसे नहीं करना है! – user3574984

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