相关疑难解决方法(0)

如何在Linux中以编程方式检测IP地址更改?

有没有办法使用C++以编程方式检测Linux中本地计算机上的IP地址更改?

c++ linux

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

绑定vs SO_BINDTODEVICE套接字

我在linux上运行一个项目(ubuntu 13.10),它使用原始套接字连接到设备.

这是我的代码:

/* builed socket */
if ((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
  perror("listener: socket");
  return -1;
}

/* Set interface to promiscuous mode */
strncpy(ifopts.ifr_name, ifName, IFNAMSIZ-1);
ioctl(sockfd, SIOCGIFFLAGS, &ifopts);
ifopts.ifr_flags |= IFF_PROMISC;
ioctl(sockfd, SIOCSIFFLAGS, &ifopts);

/* Allow the socket to be reused - incase connection is closed prematurely */
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof sockopt) == -1) {
  perror("setsockopt");
  close(sockfd);
  return -2;
}
Run Code Online (Sandbox Code Playgroud)

但是我的计算机上有2块NIC卡,我只想听其中一张.让我们说道德.我发现两个选项bind和SO_BINDTODEVICE如下:

/* option 1. Bind to device */
if (setsockopt(sockfd, SOL_SOCKET, …
Run Code Online (Sandbox Code Playgroud)

c sockets linux

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

c sendto函数在linux2.6.29中设置“网络不可访问” errno

我有一个类似于 sendto函数设置“网络无法访问”的问题,errno 和(不太像UDP广播sendto失败:Linux 2.6.30上的“网络无法访问”,但是由于此问题未得到回答并且很老,我尝试过在此重新说明它们,以期得到答案。

我有一个UDP服务器和客户端,客户端在其中广播活动消息,服务器捕获它们(代码如下)。当我在ubuntu14.04、16.04,fedora6等几个不同的台式机linux上运行它们时,它们工作正常。但是,当我尝试从mpib8308板上的ltib嵌入式Linux运行它们时,服务器正常工作(从其他计算机接收消息),但客户端将errno设置为“网络不可访问”,因为它调用sendto。
我尝试了wireshark,但客户端没有板载接口上的数据包,并且我在板上使用tcpdump测试了系统,并且那里没有生成的数据包。

这是客户端的代码:

  int clientSocket, portNum, nBytes;
  char buffer[1024];
  struct sockaddr_in serverAddr;
  socklen_t addr_size;

  /*Create UDP socket*/
  clientSocket = socket(AF_INET, SOCK_DGRAM, 0);
  int broadcastEnable=1;
  int retsockopts=setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable));
  /*Configure settings in address struct*/
  serverAddr.sin_family = AF_INET;
  serverAddr.sin_port = htons(12021);
  serverAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
  memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);  

  /*Initialize size variable to be used later on*/
  addr_size = sizeof serverAddr;

  while(1){
    sprintf(buffer,"I AM ALIVE");

    nBytes = strlen(buffer) + 1;

    int err;
    err …
Run Code Online (Sandbox Code Playgroud)

c sockets linux networking network-programming

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

标签 统计

linux ×3

c ×2

sockets ×2

c++ ×1

network-programming ×1

networking ×1