我使用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 10.10.10.111"时,错误消失.当将新的ipaddress设置为netdev时,应该运行上面的命令,否则会出现错误.为什么?谢谢.
以下代码提问:
#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的一些实现细节.
我可以在同步读取线程的不同线程中关闭tcp :: 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并接受多线程吗?
在维基百科: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 ×2
arrays ×1
boost ×1
boost-asio ×1
c++ ×1
dereference ×1
linux ×1
pointers ×1
sockets ×1
udp ×1