سؤال

حسنا، ما زلت جديدا في استخدام مآخذ C، لكنني كنت أتساءل عما إذا كانت هناك طريقة لاستخراج عنوان IP إضافة تشغيل Setsockopt؟ إذا كنت ستنظر إلى التعليمات البرمجية الخاصة بي أدناه، لدي كل شيء في مآخذ My MultiCast جاهزة للإرسال باستثناء تحديد المتغير MC_ADDR وهو عنوان IP الخاص بي.

هل أفعل أي شيء خاطئ أن يكون ملحوظا حقيقيا؟ إذا كان الأمر كذلك، فلا تتردد في إخبارنا أو تقديم اقتراحاتك. الآن رغم ذلك، أنا قلق أساسا من الحصول على المتغير MC_ADDR ممتلئا.

لم أكن مبرمجة أبدا في C قبل (فقط بيثون، C ++، ومنذ بداية هذا الصيف، والهدف - ج)، لذلك هذا هو السبب في أنني لا أعرف كل شيء هناك لمعرفة اللغة C وأبحث عن المساعدة.

file.h.

#define MYPORT 5673         /* port for our multicast socket */

int sock;                   /* socket descriptor */
char send_str[MAX_LEN];     /* string to send */
struct sockaddr_in mc_addr; /* socket address structure */
unsigned int send_len;      /* length of string to send */
char* mc_addr_str;          /* multicast IP address */
unsigned short mc_port;     /* multicast port */
unsigned char mc_ttl;       /* time to live (hop count) */

ملف file.c.

mc_port = MYPORT;
/* create a socket for sending to the multicast address  */
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
    NSLog(@"ERROR: broadcastMessage - socket() failed");
    return 1;
}

/* set the TTL (time to live/hop count) for the send */
if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, 
        (void*) &mc_ttl, sizeof(mc_ttl))) < 0) {
    NSLog(@"ERROR: broadcastMessage - setsockopt() failed");
    return 1;
}

// define the IP address we will be using
mc_addr = // ???

/* construct a multicast address structure */
memset(&mc_addr, 0, sizeof(mc_addr));
mc_addr.sin_family      = AF_INET;
mc_addr.sin_addr.s_addr = inet_addr(mc_addr_str);
mc_addr.sin_port        = htons(mc_port);

/* clear send buffer */
memset(send_str, 0, sizeof(send_str));

while (fgets(send_str, MAX_LEN, stdin)) {
    send_len = strlen(send_str);

    /* send string to multicast address */
    if ((sendto(sock, send_str, send_len, 0, 
            (struct sockaddr *) &mc_addr, sizeof(mc_addr))) != send_len) {
        NSLog(@"ERROR: broadcastMessage - sendto() sent incorrect number of bytes");
        return 1;
    }

    /* clear send buffer */
    memset(send_str, 0, sizeof(send_str));
}

close(sock);
return 0;
هل كانت مفيدة؟

المحلول

يبدو صحيحة بالنسبة لي - حيث لديك "تحديد عنوان IP، وسوف نستخدم" يجب عليك فقط تعيين MC_ADDR_STR (MC_ADDR نفسه مليء بالصنز الذي لديك بالفعل هناك، بناء على MC_ADDR_STR). شيء مثل:

mc_addr_str = "239.20.30.40";

الأمر متروك لك حقا ما عنوان البث المتعدد الذي تختاره - الشخص الذي وضعته هناك أنا فقط اختارت من نطاق "استبداله إداريا". يتعين على عملائك وخادمك فقط الموافقة عليه مسبقا (أو التفاوض عليه بطريقة أخرى، مثل العملاء اتصل بالخادم Unicast لطرح ما يجب أن يشترك فيه عنوان البث المتعدد فيه هو).

هذا الموقع قد يساعد.

نصائح أخرى

هنا هو مثال عميل متعدد الالوان في ج وآخر هنا.
الخط ذي الصلة من المثال الأول هو

saddr.sin_addr.s_addr = inet_addr("226.0.0.1"); //your mcast IP address

لست متأكدا من كيفية وجود برمجة في C++ دون فهم C.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top