有人解释我如何在类中的成员声明的顺序决定该类的大小.
例如 :
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个字节.
怎么样?
我正在尝试使用 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 有效负载,其中包含以前的标头,我将添加一些。有人可以帮助如何删除现有图层
我有一个有许多子菜单的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:我从其他示例中看到的唯一区别是,通常人们将 …
我正在开发一个从linux内核2.6迁移到3.10的项目.
2.6版本包含对api daemonize()的调用,这在新内核中不再可用.
到目前为止,我已经看到kthread_run()作为替代品.但是,当我将带有函数的kernel_thread()放入start,null和string name作为参数时,我得到了很多:"无法分叉"错误.
正确的更换可以提出任何建议吗?
目标是在具有多个接口和实时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) 我是一位经验丰富的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) #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) 我最近接受了采访,并被要求查找提供的整数位数.我有这样的事情:
#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).
我错了吗?