小编fkl*_*fkl的帖子

为什么类的大小取决于成员声明的顺序?如何?

有人解释我如何在类中的成员声明的顺序决定该类的大小.

例如 :

class temp
{
public:
    int i;
    short s;
    char c;
};
Run Code Online (Sandbox Code Playgroud)

上面这个类的大小是8个字节.

但是当成员声明的顺序改变如下

class temp
{
public:
    char c;
    int i;
    short s;
};
Run Code Online (Sandbox Code Playgroud)

那么类的大小是12个字节.

怎么样?

c c++ padding memory-alignment

20
推荐指数
1
解决办法
2431
查看次数

如何将 http 标头添加到使用 scapy 嗅探的数据包中

我正在尝试使用 scapy 嗅探一个向外发送的 http 数据包,在其中添加一些新的 http 标头并提前发送。这里的目的是在保持数据包完整的同时只插入新的标头。如果需要,应最大程度地进行任何校验和重新计算。

已经解决了几乎所有关于 SO 的问题,但没有完全得到解决方案。

以下是我所做的。

def parse(pkt):

    if pkt.haslayer(TCP) and pkt.getlayer(TCP).dport == 80 and pkt.haslayer(Raw):
        pkt = pkt / "New Header:value\r\n\r\n"

        # OR i tried this
        #pkt = pkt.getlayer(Raw).load / Raw.load(load="New Header:value\r\n\r\n")

        #pkt.getlayer(Raw).load("New Header:value\r\n\r\n")
        pkt.show()
        #del pkt[IP].chksum
        send(pkt)
#end parse function

# start sniffing
a=sniff(filter="tcp and ( port 80 )", prn=parse)
Run Code Online (Sandbox Code Playgroud)

问题是上面的代码插入了一个新的原始有效负载部分,而不是添加一个普通的标头。根据 HTTP 标准,已经有一个双换行符 \r\n\r\n 来指示标头终止。

为了克服这个问题,我尝试通过执行以下操作来删除最后一个 \r\n

   #pkt = pkt.getlayer(Raw).load[-2:] / Raw.load(load="New Header:value\r\n\r\n")
Run Code Online (Sandbox Code Playgroud)

但这会删除所有以前存在的标题,只剩下“新标题”。

我已经在 Linux mint 上试过了。

更新:我正在尝试创建一个新的 http 有效负载,其中包含以前的标头,我将添加一些。有人可以帮助如何删除现有图层

python network-programming http scapy packet-sniffers

7
推荐指数
1
解决办法
1万
查看次数

如何通过QSignalMapper或其他方式将QString从QMenu传递到Qt槽

我有一个有许多子菜单的QMenu.这些是动态创建的,即名称菜单来自db并在循环中创建.现在我想在单击菜单时触发相同的插槽trigger()或类似,但我需要将QString菜单名称传递给插槽,以便我可以执行特定于菜单的操作.我试过这个,即将QAction*传递给触发事件并使用setData,但我得到了运行时错误.

object :: connect:没有这样的信号QAction :: triggered(QAction*)

for(int j=0; j<channelTypes[i].getNumChannels() ; j++){
        QAction *subMenuAct = subMenu->addAction(tr(c_name)); // c_name the menu name
        subMenuAct->setData(ch_name);
        connect(subMenuAct, SIGNAL(triggered(QAction *)), this, SLOT(playChannel(QAction *))); // playChannel is the slot
}

void <ClassName>::playChannel(QAction *channelAction)
{
     QString str = channelAction->data().toString();
    qDebug() << "Selected - " << str;
}
Run Code Online (Sandbox Code Playgroud)

或者,我也尝试过QSignalMapper,其中signalMapper是在构造函数中初始化的数据成员

signalMapper = new QSignalMapper(this);
Run Code Online (Sandbox Code Playgroud)

for(int j=0; j<channelTypes[i].getNumChannels() ; j++){
       QAction *subMenuAct = subMenu->addAction(tr(c_name));

       connect(subMenuAct, SIGNAL(triggered()), signalMapper, SLOT(map()));
       signalMapper->setMapping(subMenu, ch_name);
       connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(playChannel(QString)));
}
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,我没有得到任何错误,但是没有调用插槽函数playChannel.如果有人能帮助解决问题,我将非常感激.

更新1:我从其他示例中看到的唯一区别是,通常人们将 …

c++ qstring qt4 qmenu qt-signals

6
推荐指数
1
解决办法
3570
查看次数

什么是3.x内核中daemonize()kernal api的替换

我正在开发一个从linux内核2.6迁移到3.10的项目.

2.6版本包含对api daemonize()的调用,这在新内核中不再可用.

到目前为止,我已经看到kthread_run()作为替代品.但是,当我将带有函数的kernel_thread()放入start,null和string name作为参数时,我得到了很多:"无法分叉"错误.

正确的更换可以提出任何建议吗?

porting kernel linux-kernel

5
推荐指数
1
解决办法
2487
查看次数

什么可以防止频繁切换具有多个接口的机器的默认源ip

目标是在具有多个接口和实时ips的计算机上频繁更改默认传出源ip.

我根据其文档使用ip route replace default,让脚本在循环中运行一段时间.它改变了源IP一段时间,但随后所有对该机器的互联网访问都丢失了.必须从Web界面远程重新启动才能使任何工作正常

是否有任何可能阻止这种情况稳定运行的事情.我在多台服务器上试过这个?

以下是最低限度的示例

# extract all currently active source ips except loopback
IPs="$(ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 |
awk '{ print $1}')"

read -a ip_arr <<<$IPs

# extract all currently active mac / ethernet addresses
Int="$(ifconfig  | grep 'eth'| grep -v 'lo' | awk '{print $1}')"
read -a eth_arr <<<$Int

ip_len=${#ip_arr[@]}
eth_len=${#eth_arr[@]}

i=0;
e=0;

while(true); do

    #ip route replace 0.0.0.0 dev eth0:1 src 192.168.1.18
    route_cmd="ip route replace 0.0.0.0 dev …
Run Code Online (Sandbox Code Playgroud)

bash routing tcp-ip iproute

5
推荐指数
1
解决办法
142
查看次数

如何在Linux中重新绑定udp套接字

我是一位经验丰富的Linux套接字程序员,正在编写一个具有许多传出接口的服务器应用程序.现在,服务器套接字与INADDR_ANY一起绑定到进程开始时的随机源端口.

稍后在某个时候提交对特定节点的响应时,我需要分配一个固定的源IP地址.执行此操作的标准方法是调用bind.但是,对于端口号调用 bind一次,连续调用失败并出现无效参数错误.

创建一个新的套接字并不是一个好的选择,因为我必须经常在响应某些客户端时这样做.

我还研究了SO和很多套接字选项,比如IP_FREEBIND,但它并不适合我的场景.

也许使用IP_PKT_INFO并设置源地址可能会有效,除非它遇到同样的问题,即一旦绑定到INADDRANY就不允许套接字重新绑定到固定的源IP后者.

有没有办法取消绑定现有套接字或在传出数据包中设置源IP地址的替代方法?

    int sock = socket(AF_INET, SOCK_DGRAM, 0);

    if(sock < 0)
        printf("Failed creating socket\n");

    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(struct sockaddr_in));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(1500);
    addr.sin_addr.s_addr = INADDR_ANY;

    // first bind succeeds
    if ( (status = bind(sock, (struct sockaddr *) &addr, sizeof(addr))) < 0)
        printf("bind error with port %s\n", strerror(errno));  

    struct sockaddr_in src_addr;
    memset(&src_addr, 0, sizeof(struct sockaddr_in));
    src_addr.sin_family = AF_INET;
    if (inet_aton("10.0.2.17", &(src_addr.sin_addr)) == 0)
        printf("Failed copying address\n");

    // …
Run Code Online (Sandbox Code Playgroud)

c sockets linux network-programming bind

4
推荐指数
1
解决办法
2万
查看次数

使用数组创建单链接列表时出现警告

#include <stdio.h>

typedef struct
{
  int data;
  struct node *next;
}node;

void print(node *head)
{
  node *tmp = head;
  while (tmp)
  {
    printf ("%d ", tmp->data);
    tmp = tmp->next;
  }
}

int main()
{
  node arr[5] = {
                  {1, &arr[1]},
                  {2, &arr[2]},
                  {3, &arr[3]},
                  {4, &arr[4]},
                  {5, NULL}
                };

  print(arr);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么在使用gcc -Wall编译时会收到这些警告?(即使没有-Wall,gcc会产生相同的警告)

list.c: In function ‘print’:
list.c:15:7: warning: assignment from incompatible pointer type [enabled by default]
list.c: In function ‘main’:
list.c:22:18: warning: initialization from incompatible pointer type …
Run Code Online (Sandbox Code Playgroud)

c arrays typedef linked-list

3
推荐指数
1
解决办法
304
查看次数

上限固定时的操作顺序

我最近接受了采访,并被要求查找提供的整数位数.我有这样的事情:

#include <iostream>

using namespace std;
int givemCountOnes (unsigned int X) {
  int count =0;
  while (X != 0 ) {
    if(X & 1)
      count++;
   X= X>>1;
  }

 return count;

}

int main() {
cout << givemCountOnes (4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道有更好的方法,但这不是问题.

问题是,这个程序的复杂性是什么?

由于它是输入中的位数,人们说这是O(n),其中n是输入中的位数.

但是我觉得既然上限sizeof(unsigned int)就是说64位,我应该说顺序是o(1).

我错了吗?

c++ algorithm bit-manipulation

2
推荐指数
1
解决办法
186
查看次数

C printf格式字符串

在C语言中,以下程序是%5 %%,但我不知道如何?

 printf("%6%5%%%78%");
Run Code Online (Sandbox Code Playgroud)

c printf

-5
推荐指数
1
解决办法
4890
查看次数