- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在发送广播包来检测 dhcp 服务器(255.255.255.255 到端口 67)上被困了几个星期。
如果有人能花时间发现我在思考过程中的缺陷,我将不胜感激。
我制作了 shellscript 来杀死 dhcpd 并断开我的 Wifi,然后使用 wpa_supplicant 再次连接
echo "Killing DHCP daemon to open up port 68"
sudo killall -TERM dhcpcd dhclient
echo "Stopping Network Service"
sudo /etc/init.d/network stop
echo "Ifdown on network interfaces"
sudo /sbin/ifconfig eth0 down
sudo /sbin/ifconfig wlan0 down
echo "Connecting to Wifi using WPA_Supplicant"
sudo /usr/sbin/wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf &
user@suse:sudo /usr/sbin/wpa_cli status
root's password:
Selected interface 'wlan0'
bssid=5c:35:3b:64:79:59
ssid=Joehoe
id=0
mode=station
pairwise_cipher=TKIP
group_cipher=TKIP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
address=00:26:c7:1e:a2:42
旁注:如果此时运行/usr/sbin/dhclient 工作正常,那么我得出结论无线确实很好
我运行以下代码:
/** Compile : gcc -m32 dhcpclient.c -o dhcpclient */
#define DHCPSERVERPORT 67
#define DHCPCLIENTPORT 68
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/******************************************************************/
/************ DHCP Message Structure ********************/
typedef struct {
unsigned char op; // Message opcode/type // unsigned char can be replaced by uint8_t, see C manual for info
unsigned char htype; // Hardware addr type
unsigned char hlen; // Hardware addr length
unsigned char hops; // Number of relay agent hops from client
unsigned long xid; // Transaction ID
unsigned short secs; // Seconds since client started looking
unsigned short flags; // Flag bits
struct in_addr ciaddr; // Client IP address (if already in use)
struct in_addr yiaddr; // Client IP address
struct in_addr siaddr; // IP address of next server to talk to
struct in_addr giaddr; // DHCP relay agent IP address
unsigned char chaddr[16]; // Client hardware address
char sname[64]; // Server name
char file[128]; // Boot filename
char magiccookie[4]; // DHCP option cookie
char options[59]; // Optional parameters (actual length dependent on MTU).
} dhcp_msg;
/************ DHCP DISCOVER ********************/
dhcp_msg dhcpdiscover(){
//struct dhcp_msg dhcpdiscover;
dhcp_msg dhcpdiscover;
dhcpdiscover.op = 1;
dhcpdiscover.htype = 1;
dhcpdiscover.hlen = 6;
dhcpdiscover.hops = 0;
dhcpdiscover.xid = 0;
dhcpdiscover.secs = 0;
dhcpdiscover.flags = 0;
dhcpdiscover.ciaddr.s_addr = htonl(INADDR_ANY);
dhcpdiscover.yiaddr.s_addr = htonl(INADDR_ANY);
dhcpdiscover.siaddr.s_addr = htonl(INADDR_ANY);
dhcpdiscover.giaddr.s_addr = htonl(INADDR_ANY);
dhcpdiscover.chaddr[0] = 0x00;
dhcpdiscover.chaddr[1] = 0x26;
dhcpdiscover.chaddr[2] = 0xC7;
dhcpdiscover.chaddr[3] = 0x1E;
dhcpdiscover.chaddr[4] = 0xA2;
dhcpdiscover.chaddr[5] = 0x42;
dhcpdiscover.chaddr[6] = 0x00;
dhcpdiscover.chaddr[7] = 0x00;
dhcpdiscover.chaddr[8] = 0x00;
dhcpdiscover.chaddr[9] = 0x00;
dhcpdiscover.chaddr[10] = 0x00;
dhcpdiscover.chaddr[11] = 0x00;
dhcpdiscover.chaddr[12] = 0x00;
dhcpdiscover.chaddr[13] = 0x00;
dhcpdiscover.chaddr[14] = 0x00;
dhcpdiscover.chaddr[15] = 0x00;
memset(dhcpdiscover.sname,0,sizeof(dhcpdiscover.sname));
memset(dhcpdiscover.file,0,sizeof(dhcpdiscover.file));
/************ setting magiccookie and options to 0 -> recognized as BootP protocol ***/
dhcpdiscover.magiccookie[0] = 99;
dhcpdiscover.magiccookie[1] = 130;
dhcpdiscover.magiccookie[2] = 83;
dhcpdiscover.magiccookie[3] = 99;
dhcpdiscover.options[0] = 53;
dhcpdiscover.options[1] = 1;
dhcpdiscover.options[2] = 1;
dhcpdiscover.options[3] = 255;
/** always set 0xff as DHCP End option to close option listing, rest is padding **/
return dhcpdiscover;
}
void printDHCPStructure(dhcp_msg dhcpstructure){
dhcp_msg dhcpstruct = dhcpstructure;
printf("\n\tDHCP Field\tBytes\tValue\n");
printf("\t----------------------------------\n");
printf("\top : \t\t1\t%x\n", dhcpstruct.op);
printf("\thtype : \t1\t%x\n", dhcpstruct.htype);
printf("\thlen : \t\t1\t%x\n", dhcpstruct.hlen);
printf("\thops : \t\t1\t%x\n", dhcpstruct.hops);
printf("\txid : \t\t1\t%x\n", dhcpstruct.xid);
printf("\tsecs : \t\t1\t%x\n", dhcpstruct.secs);
printf("\tflags : \t1\t%x\n", dhcpstruct.flags);
printf("\tciaddr : \t1\t%s\n", dhcpstruct.ciaddr);
printf("\tyiaddr : \t1\t%s\n", dhcpstruct.yiaddr);
printf("\tsiaddr : \t1\t%s\n", dhcpstruct.siaddr);
printf("\tgiaddr : \t1\t%s\n", dhcpstruct.giaddr);
printf("\tchadddr[MAC] : \t16\t%x:%x:%x:%x:%x:%x\n", dhcpstruct.chaddr[0],dhcpstruct.chaddr[1],dhcpstruct.chaddr[2],dhcpstruct.chaddr[3],dhcpstruct.chaddr[4],dhcpstruct.chaddr[5]);
printf("\tsname : \t64\t%s\n", dhcpstruct.sname);
printf("\tfile : \t\t128\t%s\n", dhcpstruct.file);
printf("\tmgckie_0 : \t1\t%d\n", (unsigned char)dhcpstruct.magiccookie[0]);
printf("\tmgckie_1 : \t1\t%d\n", (unsigned char)dhcpstruct.magiccookie[1]);
printf("\tmgckie_2 : \t1\t%d\n", (unsigned char)dhcpstruct.magiccookie[2]);
printf("\tmgckie_3 : \t1\t%d\n", (unsigned char)dhcpstruct.magiccookie[3]);
printf("\toptions : \t59\t\n");
printf("\n");
}
int bindBroadcastUdpv4(int socket,short int socketport)
{
int clientsock = socket;
struct sockaddr_in udpaddr;
memset((char *)&udpaddr, 0, sizeof(udpaddr));
udpaddr.sin_family = AF_INET;
udpaddr.sin_addr.s_addr = htonl(INADDR_ANY);
udpaddr.sin_port = htons(socketport);
if (bind(clientsock, (struct sockaddr *)&udpaddr, sizeof(udpaddr)) < 0)
{
printf("Binding the UDP Socket failed\n");
printf("Tip 1 : Run 'sudo netstat -l -u -n -p | grep %d'\n", socketport);
printf("Tip 2 : Run program with root privileges\n");
perror("Error");
exit(1);
}
else
{
return 1;
}
}
/******************************************************************/
/******************************************************************/
int main(int argc, char *argv[])
{
/** Creating UDP client socket **/
int clientsock = socket(AF_INET, SOCK_DGRAM, 0);
int broadcastpermissions = 1;
short int clientport = DHCPCLIENTPORT;
short int destinationport = DHCPSERVERPORT;
if (clientsock < 0)
{
perror("Error @ Step 1 : Cannot create client socket");
}
else
{
printf("Step 1 : Client socket created succesfully\n");
}
/** Give client socket broadcast permissions **/
if (broadcastpermissions)
{
int ret = setsockopt(clientsock,SOL_SOCKET,SO_REUSEADDR,&broadcastpermissions,sizeof(broadcastpermissions));
if (ret != 0)
{
printf("Error @ step 1BisA : Giving Client Socket reuse options FAILED: %d\n", ret);
exit(0);
}
ret = setsockopt(clientsock,SOL_SOCKET,SO_BROADCAST,&broadcastpermissions,sizeof(broadcastpermissions));
if (ret != 0)
{
printf("Error @ step 1BisB : Giving Client Socket broadcast permissions FAILED: %d\n", ret);
exit(0);
}
else
{
printf("\tSetting broadcast permissions on client socket succeeded\n");
}
}
/** Binding the client socket **/
if (bindBroadcastUdpv4(clientsock, clientport))
{
printf("Step 2 : Socket is binded succesfully\n");
}
/** Create DHCP Discovery data structure **/
dhcp_msg dhcpdiscovery = dhcpdiscover();
printf("Step 3 : DHCP Discovery Data Structure created\n");
printDHCPStructure(dhcpdiscovery);
/** Trying to broadcast to 255.255.255.255 on port 67 to detect DHCP Servers */
struct sockaddr_in destinationaddr;
memset((char *)&destinationaddr, 0, sizeof(destinationaddr));
destinationaddr.sin_family = AF_INET;
//destinationaddr.sin_addr.s_addr = INADDR_BROADCAST;
destinationaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
destinationaddr.sin_port = htons(destinationport);
//destinationaddr.sin_port = destinationport;
/** translate Hexadecimal notation of IP Address to decimal **/
int IP1 = (ntohl(destinationaddr.sin_addr.s_addr) >> 24) & 0xFF;
int IP2 = (ntohl(destinationaddr.sin_addr.s_addr) >> 16) & 0xFF;
int IP3 = (ntohl(destinationaddr.sin_addr.s_addr) >> 8) & 0xFF;
int IP4 = (ntohl(destinationaddr.sin_addr.s_addr)) & 0xFF;
//while(1){};
printf("DEBUG : Clientsock = %d\n", clientsock);
printf("DEBUG : .sin_addr = %p\n", destinationaddr.sin_addr.s_addr);
printf("DEBUG : .sin_port = %d\n", destinationaddr.sin_port);
printf("DEBUG : .sin_port = %d\n", destinationport);
/******************************************************************************************************************************************************************/
int a = sendto(clientsock,&dhcpdiscovery,sizeof(dhcpdiscovery),0,(struct sockaddr *)&destinationaddr, sizeof(destinationaddr));
if (a < 0)
{
printf("A is :\%d\n", a);
printf("UDP Message to %d.%d.%d.%d on port %d failed\n",IP1,IP2,IP3,IP4,destinationport);
perror("Sending failed : ");
return 667;
}
else
{
printf("UDP Messsage to %d.%d.%d.%d on port %d SUCCESS !\n",IP1,IP2,IP3,IP4,destinationport);
}
close(clientsock);
}
/******************************************************************/
/******************************************************************/
额外信息:A) 如前所述,当运行 dhclient 时,我得到了分配的 ip 地址,wiresharks 显示了 dhcp 对话
B) 在ipaddress已经分配的情况下运行我自己的代码时,发送成功
C) sendTo 返回的错误是'Network Unreachable'
所以我的问题是:我已连接到我的无线 AP,我需要执行哪一步才能让我的套接字发送广播数据包?这样做的原因是为了学习网络和学习编程,所以我的编程水平并不高明,所以你可能会看到荒谬的代码。我很欣赏对它的任何评论,但更愿意坚持我的主要问题。
向地球同胞致以最诚挚的问候!
最佳答案
我认为您确实想在这里使用原始套接字。虽然这是真的(根据@cklin)这意味着你必须重新发明轮子,但 dhcp 是不寻常的,因为你在正确配置接口(interface)之前发送数据包。作为一个简单的指南,我建议您查看 busybox 及其 dhclient
脚本的工作原理。另一种选择是 libpcap
。这会捕获回复(即使不是直接发送给您的回复)并且还有一个鲜为人知的功能,即也可以发送原始数据包。我已经成功地用它写了一个dhcp服务器。
关于C编程-> wpa_supplicant连接-> udp广播发送到 "Network Unreachable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20324651/
我正在使用 voip 推送通知制作 ios 应用程序。 我想从 Node js 发送 voip 推送通知,但不是很好。 我阅读了本教程 CallKit iOS Swift Tutorial for V
我编写了一个服务器,当浏览器尝试连接到某些站点时,它会检查黑名单并发回 404,但是当我调用 send() 时没有错误,但消息不会出现在网络上浏览器,除非我关闭连接? 有什么建议吗? 接受来自浏览器的
#include int main() { char c = getchar(); //EOF (ctrl + d ) while( ( c = getchar() ) != '?'
我正在尝试使用MailMessage对象通过PowerShell发送电子邮件。该脚本使用Import-CSV来使用文件,然后在电子邮件正文中使用ConvertTo-HTML。由于我要发送的电子邮件客户
我需要创建一个脚本,每 30 秒对网络流量进行一次采样并存储发送/接收的字节。该数据随后用于绘制图形。我编写了一个在 Windows 2012 上完美运行的程序,但我意识到某些 cmdlet 在以前的
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
当我使用网络浏览器测试我的程序时,我可以很好地写入套接字/FD,所以我决定循环它并在连接中途切断连接,我发现了一个问题。 send() 能够在套接字不可用时关闭整个程序。我认为问题在于该程序陷入了第
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
所以我试图向自己发送数据并接收数据然后打印它,现在我已经测试了一段时间,我注意到它没有发送任何东西,事实上,也许它是,但我没有正确接收它,我需要这方面的帮助。 这就是我用来发送数据的
问题:开发人员创建自己的序列化格式有多常见?具体来说,我使用 java 本质上将对象作为一个巨大的字符串发送,并用标记来分隔变量。 我的逻辑:我选择这个是因为它几乎消除了语言依赖性(忽略java的修改
我必须在 Linux 上编写一个应用程序,该应用程序需要与具有自定义以太网类型的设备进行通信。甚至在如何编写这样的应用程序中也有很多解决方案。一个缺点是需要 root 访问权限(AFAIK)。之后释放
我有一个包含三个单选按钮选项的表单。我需要将表单数据提交到另一个文件,但由于某种原因,发送的数据包含所选单选按钮的值“on”,而不是 value 属性的值。 我尝试通过 post() 函数手动操作和发
基本上我想实现这样的目标: Process 1 Thread 1 Receive X from process 2 Thread 2 Receive Y from proces
我目前正在 Google App Engine 上开发一个系统,对它还很陌生,我正在使用 Java 平台进行开发。我在 servlet 之间发送 session 对象时遇到问题。我已经在 appeng
当我尝试将“this”(触发的元素)作为参数发送给函数时,函数收到“Object[Document build.php]”作为参数,而不是触发的元素。请让我知道我的错误: function set(a
我正在寻找让我的应用响应联系人 > 发送的魔法咒语。我希望能够接收联系人的 URI 以便检索联系人。谁有 list 过滤器/代码 fragment 吗? 最佳答案 我没有睾丸,但您可以尝试基于 ACT
关于我心爱的套接字的另一个问题。我先解释一下我的情况。之后我会告诉你是什么困扰着我。 我有一个客户端和一个服务器。这两个应用程序都是用 C++ 编写的,实现了 winsock2。连接通过 TCP 和
我看到了这篇文章 http://www.eskimo.com/~scs/cclass/int/sx5.html 但这部分让我感到困惑:如果我们已经使用 send_array 或 send_array_
我对这行代码有疑问。我必须将一个数据包带到一个端口并重新发送到接口(interface)(例如:eth0)。我的程序成功地从端口获取数据包,但是当我重新发送(使用 send())到接口(interfa
我正在尝试编写一个 X11 输入驱动程序,它可以使用我的 Android 手机上的触摸屏来移动和单击鼠标。我可以正常移动鼠标,但我无法让应用程序正确识别点击。我当前的代码位于 https://gist
我是一名优秀的程序员,十分优秀!