Как отправить пакет через UDP CFSocket? - PullRequest
8 голосов
/ 24 июля 2011

Я - новичок в сети, однако я программист на ac / c ++ и работаю в target-c (это для OSX / iPhone).

Я пытаюсь научиться отправлятьВолшебный пакет с сокетом UDP с использованием cfsocket.Я видел, что есть такие библиотеки, как библиотека AsyncUDPSocket, однако я не хочу их использовать.

Я попытался посмотреть на UDPecho-файл яблок, но, как новичок, он меня смутил.Я гуглил вокруг ALOT, и я собрал код ниже, у меня запущен перехватчик пакетов, и он ничего не регистрирует при отправке.Я понимаю, что мой код пропускает много ошибок, но сначала я просто пытаюсь понять основы.

Правильно ли этот код?(извиняюсь, если это кажется неоднозначным) Я имею в виду, что я пропускаю определенные этапы кода, такие как: CFSocketSetAddress?

Если кто-нибудь знает какие-то действительно хорошие учебники, это поможет.

Любая помощьочень признателен, так как я начинающий в этом.

Спасибо

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    CFSocketRef WOLsocket;
    WOLsocket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, NULL, NULL);
    if ( socket == NULL) {
        NSLog(@"CfSocketCreate Failed");
    }else{
        if( socket ) {
            NSLog(@"Socket created :)");

                struct sockaddr_in addr;
                memset(&addr, 0, sizeof(addr));
                addr.sin_len = sizeof(addr);
                addr.sin_family = AF_INET;
                addr.sin_port = htons(9); //port
                inet_aton("255.255.255.255", &addr.sin_addr); //ip adress


                char ethadd []= "helloworld";
                CFDataRef Data = CFDataCreate(NULL, (const UInt8*)ethadd, sizeof(ethadd));
                CFSocketSendData(socket,NULL, Data, 0);}

    }

    [pool drain];
    return 0;
}

Ответы [ 2 ]

7 голосов
/ 24 июля 2011

Ваша проблема очень проста: вы не указываете CFSocket, куда вы хотите отправить данные.

Вы тщательно строите адрес в addr, но затем не используете его. Вам нужно либо позвонить CFSocketSetAddress, чтобы установить адрес получателя на сокете (если вы хотите, чтобы все отправляемые вами пакеты направлялись в одно и то же место назначения), либо передать адрес в качестве второго аргумента на CFSocketSendData.

0 голосов
/ 25 октября 2017

Это мой первый рабочий бит кода за две ночи!Надеюсь, поможет кто-то еще!Думаю, я должен поделиться этим, может спасти кого-то немного хлопот.

Я отключил прослушивание, так как хотел только отправить данные.

+ (void)broadCast
{
    int socketSD = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (socketSD <= 0) {
        NSLog(@"Error: Could not open socket.");
        return;
    }

    // set socket options enable broadcast
    int broadcastEnable = 1;
    int ret = setsockopt(socketSD, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable));
    if (ret) {
        NSLog(@"Error: Could not open set socket to broadcast mode");
        close(socketSD);
        return;
    }

    // Configure the port and ip we want to send to
    struct sockaddr_in broadcastAddr;
    memset(&broadcastAddr, 0, sizeof(broadcastAddr));
    broadcastAddr.sin_family = AF_INET;
    inet_pton(AF_INET, "255.255.255.255", &broadcastAddr.sin_addr);
    broadcastAddr.sin_port = htons(33333);

    char *request = "message from ios by c";
    ret = sendto(socketSD, request, strlen(request), 0, (struct sockaddr*)&broadcastAddr, sizeof(broadcastAddr));
    if (ret < 0) {
        NSLog(@"Error: Could not open send broadcast.");
        close(socketSD);
        return;
    }

    close(socketSD);

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //[self listenForPackets];
    });

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...