2014-05-18 17 views
6

Tôi muốn gửi và nhận các gói trên cùng một socket, có thể hoặc tôi phải tạo hai socket, một để gửi và một để nhận? Nếu có, bạn có thể cho tôi một ví dụ không?c - udp gửi và nhận trên cùng một socket

Một câu hỏi khác: làm thế nào tôi có thể lấy ip nguồn từ gói nhận được?

EDIT (mã ví dụ):

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

Trả lời

12

Có, bạn có thể sử dụng ổ cắm tương tự cho việc gửi và nhận. recvfrom() cho bạn biết IP/cổng của người gửi. Đơn giản chỉ cần sendto() rằng IP/port bằng cách sử dụng ổ cắm tương tự mà bạn sử dụng với recvfrom(), ví dụ:

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

bạn có thể xin vui lòng gửi một ví dụ? – user3574984

+0

Trong số những gì? gửi/nhận? Hoặc nhận nguồn IP/Cổng? Có rất nhiều ví dụ về cả hai trực tuyến nếu bạn nhìn xung quanh. –

+0

Máy chủ nhận gói tin => trả lời lại trên cùng một ổ cắm udp ... Tôi biết cách nhận và cách gửi, nhưng không phải cách thực hiện với cùng một ổ cắm! – user3574984

Các vấn đề liên quan