获取所有连接设备的IP地址(UDP)

时间:2017-05-19 15:37:21

标签: c udp

我找了一个类似的问题,但我找不到一个适合我的问题。我正在为我的一个科目做一个简单的项目,但我从未有过使用套接字的经验,所以我需要一些帮助来实现一个功能。

基本上,有几个单元通过通信网络(物理以太网1Gbps,TCP / IP协议)互连,我必须能够与所有主板通信。我可以在一个特定的电路板上实现我需要的所有其他功能,但我不知道如何同时操作所有电路板。

所以,问题是:如何获得所有连接板的列表以及如何选择哪个板应该接收/发送消息?

非常感谢任何愿意提供帮助的人。

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>

#include "mzapo_parlcd.h"
#include "mzapo_phys.h"
#include "mzapo_regs.h"

#define MY_PORT 55555
#define BUFLEN 512


int main(int argc, char *argv[])
{ 
  int sockfd;
  char buffer[BUFLEN];
  struct sockaddr_in peeraddr;

  // SET UP A NETWORK SOCKET
  if ((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1) {
    perror("socket");
    exit(1);
  }

  int broadcast = 1;
  if (setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST, & broadcast,
    sizeof broadcast) == -1) {
    perror("setsockopt (SO_BROADCAST)");
    exit(1);
  }

  struct sockaddr_in bindaddr;

  memset(&bindaddr, 0, sizeof(bindaddr));
  bindaddr.sin_family = AF_INET;
  bindaddr.sin_port = htons(MY_PORT);
  bindaddr.sin_addr.s_addr = INADDR_ANY;

  int yes=1;

  if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
                sizeof(yes)) == -1) {
    perror("setsockopt (SO_REUSEADDR)");
    exit(1);
  }

  if (bind(sockfd, (struct sockaddr *)&bindaddr, sizeof(bindaddr)) == -1) {
    perror("bind");
    exit(1);
  }

  broadcast = 1;

    if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast,
        sizeof broadcast) == -1) {
        perror("setsockopt (SO_BROADCAST)");
        exit(1);
    }

  struct sockaddr_in braddr;  

  memset(&braddr, 0, sizeof(braddr));
  braddr.sin_family = AF_INET;
  braddr.sin_port = htons(MY_PORT );
  braddr.sin_addr.s_addr = INADDR_BROADCAST;  

  strncpy(buffer, "Hello world", sizeof(buffer));

  char* ipString = inet_ntoa(bindaddr.sin_addr);

  while(1){

  printf("%s", ipString); 

  if (sendto(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&braddr, sizeof(braddr)) == -1){
      perror("sendto");
      exit(1);
  }

  peeraddr_len = sizeof(peeraddr);

  }  
  return 0; 
}

0 个答案:

没有答案