小编Mam*_*rot的帖子

UDP广播发送失败:linux 2.6.30上的"网络无法访问"

我使用udp broadcast.Code段编写程序如下:

struct sockaddr_in broadcast_addr;
socklen_t sock_len=sizeof(broadcast_addr);

bzero(&broadcast_addr,sock_len);
broadcast_addr.sin_family=AF_INET;
broadcast_addr.sin_port=12345;
broadcast_addr.sin_addr.s_addr=inet_addr("255.255.255.255");

int fd=socket(AF_INET,SOCK_DGRAM,0);
int broadcast_enable=1;
setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&broadcast_enable,sizeof(broadcast_enable));

uint8_t send_buf[100];
int ret=sendto(fd,send_buf,sizeof(send_buf),0,
       (struct sockaddr*)&broadcast_addr,sock_len);

 if(ret==-1)
    perror("sendto failed");
Run Code Online (Sandbox Code Playgroud)

输出:

sendto failed: Network is unreachable
Run Code Online (Sandbox Code Playgroud)

但是当我运行"添加默认网关"命令如"route add default gw 1​​0.10.10.111"时,错误消失.当将新的ipaddress设置为netdev时,应该运行上面的命令,否则会出现错误.为什么?谢谢.

sockets linux udp

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

指向C多维数组的指针的地址

以下代码提问:

#include <stdio.h>

int main(int argc,char *arg[]){

    if (argc>2){
      int m=atoi(arg[1]);
      int n=atoi(arg[2]);

      int a[m][n];
      int (*p)[m][n]=&a;

      printf("p : %p, *p : %p, **p : %p\n",p,*p,**p);
    }

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

主要环境:gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)x86-64

gcc main.c
./a.out 2 4
Run Code Online (Sandbox Code Playgroud)

输出:

p : 0xbfea7ef0, *p : 0xbfea7ef0, **p : 0xbfea7ef0
Run Code Online (Sandbox Code Playgroud)

问题是为什么p == *p == **p.我认为这可能是因为a是一个数组,一种常量指针,其地址是特定的,这涉及gcc的一些实现细节.

c arrays pointers dereference

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

[boost.asio]在I/O线程的不同线程中关闭tc​​p :: socket或tcp :: acceptor

我可以在同步读取线程的不同线程中关闭tc​​p :: socket吗?看起来像:

boost::asio::ip::tcp::socket* tcp_socket;  //blocking mode
Run Code Online (Sandbox Code Playgroud)

线程1:

while(true){
   try{
       std::vector<char> read_buffer(10);
       tcp_socket->read_some( boost::asio::buffer( read_buffer ) );
  }
  catch(boost::system::system_error& e){
  //TODO
  break;
  }
}
Run Code Online (Sandbox Code Playgroud)

线程2:

tcp_socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
tcp_socket->close();
Run Code Online (Sandbox Code Playgroud)

我看到了tcp :: socket 的文档.他们说这个对象是线程不健全的.但是演示代码似乎运行良好.那么安全吗?那么tcp :: acceptor呢?我可以在相同的tcp :: acceptor上调用close并接受多线程吗?

c++ boost boost-asio

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

RBTree的颜色技巧如何运作?

在维基百科:Red-black_tree

跟踪每个节点的颜色每个节点只需要1位信息,因为只有两种颜色.该树不包含任何其他特定于红色 - >黑色树的数据,因此其内存占用量几乎与经典(无色)二叉搜索>树相同.在许多情况下,可以在没有额外存储器>成本的情况下存储额外的信息.

我在C中找到了一个rbtree的工具:

#ifdef UINTPTR_MAX

static inline enum rb_color get_color(const struct rbtree_node *node)
{
    return node->parent & 1;
}

static inline void set_color(enum rb_color color, struct rbtree_node *node)
{
    node->parent = (node->parent & ~1UL) | color;
}

static inline struct rbtree_node *get_parent(const struct rbtree_node *node)
{ 
    return (struct rbtree_node *)(node->parent & ~1UL);
}

static inline void set_parent(struct rbtree_node *parent, struct rbtree_node *node)
{
    node->parent = (uintptr_t)parent | (node->parent & 1);
}

#else
...
#endif
Run Code Online (Sandbox Code Playgroud)

我的问题是这种颜色技巧是如何工作的?Thx.

c red-black-tree

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

标签 统计

c ×2

arrays ×1

boost ×1

boost-asio ×1

c++ ×1

dereference ×1

linux ×1

pointers ×1

red-black-tree ×1

sockets ×1

udp ×1