小编mis*_*yes的帖子

如何使指针增加1个字节,而不是1个单位

我有一个结构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)

但它有点麻烦.有没有更好的方法?

c pointers increment

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

libpcap无法捕获IP片段

我想捕获发往本地端口的UDP数据包,过滤表达式就像udp port 20000.我注意到如果UDP数据包上存在IP分片,libpcap只能捕获第一个IP分片.我猜的原因是第二个IP片段没有UDP头(我认为它与TCP相同),所以libpcap无法使用filter express捕获它们udp port 20000.

这有什么解决方法吗?或任何其他可以捕获发往特定本地端口的数据包的库?

谢谢!

tcpdump libpcap

8
推荐指数
1
解决办法
4083
查看次数

为什么`memchr()`函数将`int`用作char类型的参数?

以下函数int用作第二个参数类型,

memchr(const void *buf, int ch, size_t count);
Run Code Online (Sandbox Code Playgroud)

虽然用于character类型。为什么定义了int用于char类型参数的函数?有什么特殊原因吗?

c char

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

为什么字节顺序在字节内的位之间很重要?

以下是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)

c endianness bit

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

加载共享库时出错:libevent-1.4.so.2:无法打开共享对象文件:

我正在使用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)

linux compiler-errors shared-libraries libevent

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

如何从python进程池中获取进程

我想创建许多进程,每个进程比前一个进程运行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)

是否有满足我需求的库或源代码片段?谢谢

python multiprocessing

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

TCP 标头选项:允许 SACK(选择性确认)协商

我正在做一个研究项目,需要拆分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?这取决于操作系统或内核设置还是其他什么?可以控制吗?谢谢!

networking tcp network-protocols

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

线程和进程id的值范围是多少?

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的值范围是多少?

c linux multithreading multiprocessing

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

libpcap:pcap_dispatch 或 pcap_next 的效率是多少

我使用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),并注意:

  1. 一开始发送数据包的间隔很小
  2. 发送几个数据包后,间隔变为0.055秒左右
  3. 发送20个包后,间隔变为0.031秒,并保持为0.031秒

我仔细检查了我的源代码,没有发现任何可疑的块或逻辑导致如此大的间隔。所以我想知道是否是由于功能的问题pcap_dispatch

pcap_dispatch 或 pcap_next 甚至 libpcap 文件描述符是否存在效率问题?谢谢!

network-programming tcpdump libpcap

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

使用printf以十六进制格式打印字符串,结果失真

我想以十六进制格式打印字符串,

在机器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)

c printf

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