我有一个结构tcp_option_t,这是N字节.如果我有一个指针tcp_option_t* opt,我希望它增加1,我不能使用opt++或++opt因为这将增加sizeof(tcp_option_t),这是N.
我想将此指针仅移动1个字节.我目前的解决方案是
opt = (tcp_option_t *)((char*)opt+1);
Run Code Online (Sandbox Code Playgroud)
但它有点麻烦.有没有更好的方法?
我想捕获发往本地端口的UDP数据包,过滤表达式就像udp port 20000.我注意到如果UDP数据包上存在IP分片,libpcap只能捕获第一个IP分片.我猜的原因是第二个IP片段没有UDP头(我认为它与TCP相同),所以libpcap无法使用filter express捕获它们udp port 20000.
这有什么解决方法吗?或任何其他可以捕获发往特定本地端口的数据包的库?
谢谢!
以下函数int用作第二个参数类型,
memchr(const void *buf, int ch, size_t count);
Run Code Online (Sandbox Code Playgroud)
虽然用于character类型。为什么定义了int用于char类型参数的函数?有什么特殊原因吗?
以下是Linux机器上库的IP结构
struct ip
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ip_hl:4; /* header length */
unsigned int ip_v:4; /* version */
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned int ip_v:4; /* version */
unsigned int ip_hl:4; /* header length */
#endif
u_int8_t ip_tos; /* type of service */
u_short ip_len; /* total length */
u_short ip_id; /* identification */
u_short ip_off; /* fragment offset field */
#define IP_RF 0x8000 /* reserved fragment flag */
#define IP_DF 0x4000 /* dont fragment flag …Run Code Online (Sandbox Code Playgroud) 我正在使用libevent进行程序,我在两台计算机A和B上编译我的程序,在A上执行成功,但在BI上遇到以下错误:
error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
供参考:
A和B都带有fedora系统,在A和B上,我都下载了libevent-1.4.14b-stable.tar.gz,并通过configure/make/make install安装它.
在A上
[esolve@kitty temp]$ uname -r
3.6.10-2.fc16.x86_64
[esolve@kitty temp]$ ls -al /usr/local/lib64 | grep libevent
[esolve@kitty temp]$ ls -al /usr/lib64 | grep libevent
[esolve@kitty temp]$ ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 32 May 21 00:25 libevent-1.4.so.2 -> /usr/local/lib/libevent-1.4.so.2
[esolve@kitty temp]$ ls -al /usr/local/lib | grep libevent
lrwxrwxrwx 1 root root 21 May 21 00:22 libevent-1.4.so.2 …Run Code Online (Sandbox Code Playgroud) 我想创建许多进程,每个进程比前一个进程运行5秒,即每个进程启动之间的时间间隔为5秒,这样:运行进程1等待5秒运行进程2等待5秒运行进程3等待5秒 .....
喜欢:
for i in range(10):
p = multiprocessing.Process(target=func)
p.start()
sleep(5)
#after all child process exit
do_something()
Run Code Online (Sandbox Code Playgroud)
但我想在所有进程退出后调用do_something()我不知道如何在这里进行同步
有了python池库,我可以拥有
pool = multiprocessing.Pool(processes=4)
for i in xrange(500):
pool.apply_async(func, i)
pool.close()
pool.join()
do_something()
Run Code Online (Sandbox Code Playgroud)
但是这样,4个进程将同时运行,我无法确定进程之间的时间间隔,是否可以创建进程池然后获取每个进程,类似于
pool = multiprocessing.Pool(processes=4)
for i in xrange(500):
process = pool.fetch_one()
process(func, i)
time.sleep(5)
pool.close()
pool.join()
do_something()
Run Code Online (Sandbox Code Playgroud)
是否有满足我需求的库或源代码片段?谢谢
我正在做一个研究项目,需要拆分tcp连接。所以我有一些特殊的问题,这些问题可能会在我的发展中发生。问题在于理解 TCP SACK 允许的协商。我阅读了 RFC,但找不到答案。
对于两个 tcp 程序之间的 3 路 tcp 握手:A 和 B。如果 A 向 B 发送允许 SACK 的 TCP SYN,B 一定会响应允许 SACK 的 SYN/ACK 数据包吗?如果 B 在没有 SACK 许可的情况下回复 TCP SYN/ACK,这是否意味着
1) SACK-permmited 仅在 A 上启用。A 可以选择性地确认来自 A 的 tcp 数据包,但 A 不能选择性地确认来自 B 的 tcp 数据包。
或者
2) A 和 B 上均未启用 SACK-permitted
如果A在没有SACK许可的情况下向B发送TCP SYN,B可以用SACK许可来响应SYN/ACK数据包吗?
另外,为什么允许或不允许SACK-permited?这取决于操作系统或内核设置还是其他什么?可以控制吗?谢谢!
fork并且pthread_create将返回一个进程ID或线程ID.
但我不知道这些ID的价值范围.
现在我想创建一个查找表,在每个条目中都有一个项目/字段用于线程ID.每个条目的结构如下:
typedef struct {
int seq;
pthread_t tid;
...
} entry_t;
Run Code Online (Sandbox Code Playgroud)
tid当我没有得到一个线程的tid时,我想为一个条目赋予一个无效的值(很快这个字段将填充一个有效的,但在此之前该fill函数将检查pid是否有效) .那么,线程和进程id的值范围是多少?
我使用libpcap捕获很多数据包,然后处理/修改这些数据包并将它们发送到另一台主机。
首先,我创建一个 libpcap 处理程序handle并将其设置为非阻塞,并用于pcap_get_selecable_fd(handle)获取相应的文件描述符pcap_fd。
然后我将一个事件添加pcap_fd到 libevent 循环中(就像 select() 或 epoll())。
为了避免频繁轮询这个文件描述符,每次有数据包到达事件时,我使用 pcap_dispatch 收集缓冲区的数据包并将它们放入队列中packet_queue,然后调用process_packet处理/修改/发送队列中的每个数据包packet_queue。
pcap_dispatch(handle, -1, collect_pkt, (u_char *)packet_queue);
process_packet(packet_queue);
Run Code Online (Sandbox Code Playgroud)
我使用 tcpdump 捕获 发送的数据包process_packet(packet_queue),并注意:
我仔细检查了我的源代码,没有发现任何可疑的块或逻辑导致如此大的间隔。所以我想知道是否是由于功能的问题pcap_dispatch。
pcap_dispatch 或 pcap_next 甚至 libpcap 文件描述符是否存在效率问题?谢谢!
我想以十六进制格式打印字符串,
在机器A上,类似于
ori_mesg = gen_rdm_bytestream (1400,seed)
sendto(machine B, ori_mesg, len(mesg))
Run Code Online (Sandbox Code Playgroud)
在机器B上
recvfrom(machine A, mesg)
mesg_check = gen_rdm_bytestream (1400, seed)
for(i=0;i<20;i++){
printf("%02x ", *(mesg+i)& 0xFF);
}
printf("\n");
for(i=0;i<20;i++){
printf("%02x ", *(mesg_check+i));
}
printf("\n");
Run Code Online (Sandbox Code Playgroud)
seed 在1,2,3之间变化....
字节生成函数是:
u_char *gen_rdm_bytestream (size_t num_bytes, unsigned int seed)
{
u_char *stream = malloc (num_bytes+4);
size_t i;
u_int16_t seq = seed;
seq = htons(seq);
u_int16_t tail = num_bytes;
tail = htons(tail);
memcpy(stream, &seq, sizeof(seq));
srand(seed);
for (i = 3; i < num_bytes+2; i++){
stream[i] = rand (); …Run Code Online (Sandbox Code Playgroud)