Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2012, 21:01   #1
maximnikmazin
Новичок
Джуниор
 
Регистрация: 14.12.2012
Сообщений: 1
По умолчанию Необходимо написать простой DHCP Client

Необходимо написать простой DHCP Client. Помогите!
Я понял принцип работы протокола, но если честно не уверен
правильно ли я формирую пакет для dhcp сервера. Ответа от
него никакого не приходит. Гугл перерыл, но однозначного ответа
так и не нашел. Broadcast работает. Проверял.
Итак, вот мой код. Помогите разобраться пожалуйста!

Код:
#include "stdafx.h"
#include <winsock2.h>
 
#pragma comment (lib,"ws2_32.lib")
 
int _tmain(int argc, _TCHAR* argv[])
{
    #pragma region Establishing connection
    WSADATA wsaData;
    SOCKET SendSocket;
    SOCKET RecvSocket;
    sockaddr_in RecvAddr,SendAddr;
 
    byte Buf[256];
    int  BufLen = 256;
    
    //-----------------------------------------------
    // Initialize Winsock
    WSAStartup(MAKEWORD(2,2), &wsaData);
 
    //-----------------------------------------------
    // Create a receiver socket to receive datagrams
    RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);   
    SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    int f = 1;
    int res = setsockopt(SendSocket, SOL_SOCKET, SO_BROADCAST, (char*)&f, sizeof(f));
    printf("setsockopt SendSocket %i\n", res);
    res = setsockopt(RecvSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&f, sizeof(f));
    printf("setsockopt RecvSocket %i\n", res);
 
    //-----------------------------------------------
    // Bind the socket to any address and the specified port.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(68);
    RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 
    SendAddr.sin_family = AF_INET;
    SendAddr.sin_port = htons(67);
    SendAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    #pragma endregion
 
    //-----------------------------------------------
    // Call the recvfrom function to receive datagrams
    // on the bound socket.
 
    char * str;
    str = (char *)Buf;
    memset(Buf, '0', BufLen);
    Buf[255] = 0;
 
    Buf[0]=1;   //op
    Buf[1]=1;   //htype
    Buf[2]=6;   //hlen
 
    Buf[4]=1053902674;  //xid
    //Buf[5]=1; //xid
    //Buf[6]=1; //xid
    //Buf[7]=1; //xid
 
    Buf[16]=192;    //ciaddr
    Buf[17]=168;    //ciaddr
    Buf[18]=2;      //ciaddr
    Buf[19]=4;      //ciaddr
 
    //mac 52-08-CA-F1-EC-5B
    Buf[28]=0x52;   //chaddr
    Buf[29]=0x08;   //chaddr
    Buf[30]=0xca;   //chaddr
    Buf[31]=0xf1;   //chaddr
    Buf[32]=0xec;   //chaddr
    Buf[33]=0x5b;   //chaddr
    //options
    Buf[236]=53;
    Buf[237]=50;
 
    res = bind(SendSocket, (SOCKADDR *) &SendAddr, sizeof(SendAddr));
    printf("bind SendSocket %i\n", res);
    res = bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
    printf("bind RecvSocket %i\n", res);
    int k = sizeof(RecvAddr);
    while (1)
    {
        res = sendto(SendSocket, (char*)Buf, BufLen, 0, (SOCKADDR *)&SendAddr, sizeof(SendAddr));
        printf("sendto %i\n %s\n", res, Buf);
        printf("Receiving datagrams...\n");
 
        res = recvfrom(RecvSocket,(char*)Buf, BufLen, 0, (SOCKADDR *)&RecvAddr, &k);
        printf("recvfrom %i\n %s\n", res, Buf);
        Sleep(2000);
    }
    printf("ip address: %i.%i.%i.%i",(int)Buf[20],(int)Buf[21],(int)Buf[22],(int)Buf[23]);
 
    //-----------------------------------------------
    // Close the socket when finished receiving datagrams
    printf("Finished receiving. Closing socket.\n");
    closesocket(SendSocket);
 
    //-----------------------------------------------
    // Clean up and exit.
    printf("Exiting.\n");
    WSACleanup();
    return 0;
}
maximnikmazin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо создать простой PHP скрипт рассылки новостей kutt Фриланс 1 13.12.2011 22:25
Написать простой сценарий на JS elris Фриланс 4 05.10.2011 17:52
Необходимо исправить простой скрипт /Sony/ JavaScript, Ajax 2 27.09.2011 15:47
Как написать RDP Client ? kakawkin C/C++ Сетевое программирование 0 09.08.2011 17:46
Необходимо дописать простой скрипт на PHP+Mysql kutt Фриланс 8 08.10.2009 13:09