使用UDP广播进行主机发现

时间:2015-11-19 20:06:23

标签: c sockets network-programming udp subnet

我正在尝试在 C 中编写一个程序,通过 UDP 协议进行广播,然后计算其数量,以发现我子网上的主机 ICMP_PORT_UNREACHABLE消息。

我的代码

int main(int argc,char *argv[])
{   
    //Take port number as user input
    in_port_t port=htons((in_port_t) atoi(argv[1]));

    struct sockaddr_storage deststorage;
    memset(&deststorage,0,sizeof(deststorage));
    size_t addrsize=0;

    char recvbuff[100];
    struct sockaddr_in clientaddr;
    int clientlen=sizeof(clientaddr);

    //creating sockaddr_in for some random port
    struct sockaddr_in recvsock;
    memset(&recvsock,0,sizeof(recvsock));
    recvsock.sin_port=htons(34234);
    recvsock.sin_family=AF_INET;
    recvsock.sin_addr.s_addr = htonl(INADDR_ANY);

    //destination address for broadcasting
    struct sockaddr_in *da=(struct sockaddr_in *) &deststorage;
    da->sin_family=AF_INET;
    da->sin_port=port;
    da->sin_addr.s_addr=INADDR_BROADCAST;

    addrsize=sizeof(struct sockaddr_in);
    struct sockaddr *destadd=(struct sockaddr *)&deststorage;

    //Take message to be sent as command line argument
    size_t msglen=strlen(argv[2]);

    //creating socket
    int sock=socket(destadd->sa_family,SOCK_DGRAM,IPPROTO_UDP);

    int broadcastperm=1;
    if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&broadcastperm,sizeof(broadcastperm))<0)
        perror("setsocket failed\n");

    if(bind(sock,(struct sockaddr *)&recvsock,sizeof(recvsock)) == -1)
        perror("Bind error");

    for(;;)
    {
        printf("sending broadcast\n");
        ssize_t nbytes=sendto(sock,argv[2],msglen,0,destadd,addrsize);
        if(nbytes<0) perror("sendto failed");
        else if(nbytes!=msglen)
           perror("size diff");

        int n = recvfrom(sock, recvbuff, 100, 0,(struct sockaddr *) &clientaddr, &clientlen);
        if (n < 0)
            perror("ERROR in recvfrom");
        else
            printf("received reply from %s:%d\n",inet_ntoa(clientaddr.sin_addr),(int)ntohs(clientaddr.sin_port));

        //Prevent network congestion
        sleep(3);
    }
}

我在这段代码中基本上做的是: -

  1. 首先创建一个UDP套接字并将其绑定到某个随机的更高端口号,并使用
  2. 上的广播选项
  3. 发送广播至255.255.255.255
  4. 然后等待主持人回复。
  5. 我在此代码中的问题是在recvfrom阻止并且没有收到其他主机的回复。

    如果这个问题是由于套接字没有连接,那么它可能没有收到ICMP错误,但是当我尝试将套接字连接到255.255.255.255之后,套接字也没有收到任何回复,但只有阻止

0 个答案:

没有答案
相关问题