Необходимо написать простой 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;
}