如何获得可以传递给sendto(..)作为UDP端口打开的套接字的调用的最大字节数?
我使用以下代码检索当前计算机的所有MAC地址:
ifreq ifr;
ifconf ifc;
char buf[1024];
int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock == -1) { ... };
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { ... }
ifreq *it = ifc.ifc_req;
const ifreq* const end = it + (ifc.ifc_len / sizeof(ifreq));
for (; it != end; ++it) {
strcpy(ifr.ifr_name, it->ifr_name);
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
if (!(ifr.ifr_flags & IFF_LOOPBACK)) {
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
unsigned char mac_address[6]; …Run Code Online (Sandbox Code Playgroud) 我一直在做一些研究,我对这个宏有点困惑.希望有人可以给我一些指导.我有一些ioctl代码(我继承了,没有编写),如果access_ok()在继续从用户空间复制数据之前检查是否它会做的第一件事:
#define __lddk_copy_from_user(a,b,c) copy_from_user(a,b,c)
#define __lddk_copy_to_user(a,b,c) copy_to_user(a,b,c)
long can_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
switch(cmd) {
case COMMAND:
if(! access_ok(VERIFY_READ, (void *)arg, sizeof(Message_par_t)))
return(retval);
if(! access_ok(VERIFY_WRITE, (void *)arg, sizeof(Message_par_t)))
return(retval);
argp = &Command;
__lddk_copy_from_user( (void *) argp,(Command_par_t *) arg, sizeof(Command_par_t));
Run Code Online (Sandbox Code Playgroud)
所以代码工作正常,但我不确定它是否需要.第一个问题来自access_ok的返回描述:
所以这意味着它真的什么都没做,那么确保我们检查的指针可能在用户空间中被初始化了?既然我们知道除了用户空间调用之外我们不能进入这个功能,除非我们为这个设备打开一个有效的文件描述符,否则它不会发生,这真的需要吗?它确实比确保我们没有得到NULL指针更安全吗?
第二个问题来自这个描述:
这是否意味着我的代码中的第一次检查是多余的?如果我们要检查可写区域,我们可以作为免费赠品阅读吗?
我正在使用x86架构,所以access_ok()和__range_no_ok()的定义来自/usr/src/linux-3.1.10-1.16/arch/x86/include/asm/uaccess.h,如下所示:
#define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0))
#define __range_not_ok(addr, size) \
({ \
unsigned long flag, roksum; \
__chk_user_ptr(addr); \
asm("add %3,%1 ; sbb …Run Code Online (Sandbox Code Playgroud) 标题几乎说明了一切.如果我跑ifconfig,我得到这个:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet -snip- netmask 255.255.255.0 broadcast -snip-
...
Run Code Online (Sandbox Code Playgroud)
使用它,我可以知道它是否已启动(<UP,...),但我希望能够在C(或C++,如果有更简单的解决方案)中执行此操作,而不依赖于解析外部进程.
这是我到目前为止所做的(不起作用):
bool is_interface_online(std::string interface) {
struct ifreq ifr;
int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, interface.c_str());
if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
perror("SIOCGIFFLAGS");
}
close(sock);
return !!(ifr.ifr_flags | IFF_UP);
}
Run Code Online (Sandbox Code Playgroud)
任何人都能指出我正确的方向吗?
我想知道iwlist命令如何在linux中扫描可用的无线网络.我读了它的源代码,并且有一个使用SIOCSIWSCAN触发扫描的ioctl调用和SIOCGIWSCAN来获取扫描结果.但是这些系统调用如何捕获和分析信标帧?
在linux机器上的用户模式[非root]中,我试图通过使用a来绑定套接字ioctl(iInterfaceSocket, SIOCSIFADDR, &stCommand).我到了error 13 -> Permission denied because of user mode.如果从usermode更改为内核模式,一切正常.
我只需要在用户模式下绑定套接字.请在解释上述问题时提出解决方案.如果我错过了任何信息,请告诉我,我会提供更多信息.
我试图通过使用MSDN上描述的OVERLAPPED结构异步调用DeviceIO函数.我使用FSCTL_ENUM_USN_DATA控制代码枚举NTFS驱动器的MFT,但我不能异步运行它.文件句柄是使用FILE_FLAG_OVERLAPPED创建的,但是我是否使用FILE_FLAG_OVERLAPPED的重叠结构没有区别.该功能不会立即返回.在这两种情况下似乎都是同步的.下面的示例显示了C:\驱动器上前100.000个MFT条目的枚举.由于我不太熟悉重叠结构的使用,我可能做错了.我的问题:如何异步执行DeviceIoControl(hDevice,FSCTL_ENUM_USN_DATA,...)?谢谢你的帮助.
#include "stdafx.h"
#include <Windows.h>
typedef struct {
DWORDLONG nextusn;
USN_RECORD FirstUsnRecord;
BYTE Buffer[500];
}TDeviceIoControlOutputBuffer, *PTDeviceIoControlOutputBuffer;
int _tmain(int argc, _TCHAR* argv[])
{
MFT_ENUM_DATA lInputMftData;
lInputMftData.StartFileReferenceNumber = 0;
lInputMftData.MinMajorVersion = 2;
lInputMftData.MaxMajorVersion = 3;
lInputMftData.LowUsn = 0;
lInputMftData.HighUsn = 0;
TDeviceIoControlOutputBuffer lOutputMftData;
DWORD lOutBytesReturned = 0;
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
OVERLAPPED lOverlapped = { 0 };
lOverlapped.hEvent = hEvent;
LPCWSTR path = L"\\\\.\\C:";
HANDLE hDevice = CreateFile(path, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if …Run Code Online (Sandbox Code Playgroud) 经过在互联网上的一些搜索,我发现以下是可用于获取/设置以太网接口参数的选项列表。
SIOCETHTOOLSIOCGMIIPHYSIOCGIFFLAGS我什至看到一些关于SIOCETHTOOL的使用的“stackoverflow”问题。但我的问题是:
SIOCETHTOOL和的文档SIOCGMIIPHY。你能指点一下吗?我正在尝试用 C++ 编写一个应用程序,其中列出从 USB 设备获取的信息。我正在关注 USBView ( Github ) 实用程序的代码。
当设备处于D0电源状态(完全供电)时,我能够获取字符串描述符,但是当设备进入低功耗状态时(D2),我无法获取字符串描述符。
IOCTLIOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION返回错误“连接到系统的设备无法正常工作”。USBView 实用程序显示当设备处于低功耗状态时字符串描述符不可用。
这种行为很奇怪,我在 USB 规范中没有找到任何参考。我检查了两台设备,得到了相同的行为。即使在状态下,我也能够获取其他描述符,例如设备描述符、BOS 描述符等D2。
当USB设备处于低功耗状态时,有没有办法获取字符串描述符?如果没有,有没有办法暂时将其转为 D0 电源状态?也许 ACPI 就是答案,但它是一个非常低级的 API,我发现它很难理解。Windows 是否提供任何高级 API 来设置电源状态?
我一直在我创建的虚拟环境中运行 python 脚本pipenv shell,它运行良好。
我总是从 bash 脚本运行该进程,该脚本将目录更改为包含 python 脚本的文件夹,使用 激活 virtualenv pipenv shell,然后运行 python 脚本,然后退出 virtualenv。
但是,我一定在终端中输入了错误的内容并破坏了某些内容,现在当我在虚拟环境中运行脚本时,我得到了这个:
Launching subshell in virtual environment...
Traceback (most recent call last):
File "/home/manuel/.local/bin/pipenv", line 8, in <module>
sys.exit(cli())
File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/manuel/.local/lib/python3.8/site-packages/pipenv/vendor/click/core.py", line 610, in invoke
return callback(*args, …Run Code Online (Sandbox Code Playgroud)