Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用UDP广播的主机发现_C_Sockets_Network Programming_Udp_Subnet - Fatal编程技术网

C 使用UDP广播的主机发现

C 使用UDP广播的主机发现,c,sockets,network-programming,udp,subnet,C,Sockets,Network Programming,Udp,Subnet,我正试图在C中编写一个程序,通过UDP协议进行广播,然后计算ICMP\u端口无法访问的消息数,来发现我的子网上的主机 我的代码 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(&d

我正试图在C中编写一个程序,通过UDP协议进行广播,然后计算ICMP\u端口无法访问的消息数,来发现我的子网上的主机

我的代码

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);
    }
}
intmain(intargc,char*argv[])
{   
//将端口号作为用户输入
in_port_t port=htons((in_port_t)atoi(argv[1]);
结构sockaddr\u存储deststorage;
memset(&deststorage,0,sizeof(deststorage));
大小\u t addrsize=0;
char recvbuff[100];
clientaddr中的结构sockaddr_;
int clientlen=sizeof(clientaddr);
//为某个随机端口创建sockaddr\u in
recvsock中的结构sockaddr_;
memset(&recvsock,0,sizeof(recvsock));
recvsock.sin_port=htons(34234);
recvsock.sin_family=AF_INET;
recvsock.sin_addr.s_addr=htonl(INADDR_ANY);
//广播目的地址
*da中的struct sockaddr_=(struct sockaddr_in*)和deststorage;
da->sin_family=AF_INET;
da->sin_端口=端口;
da->sin\u addr.s\u addr=INADDR\u广播;
addrsize=sizeof(结构sockaddr_in);
结构sockaddr*destadd=(结构sockaddr*)&deststorage;
//将要发送的消息作为命令行参数
尺寸=斯特伦(argv[2]);
//创建套接字
int sock=socket(destadd->sa_族、sock_DGRAM、IPPROTO_UDP);
int-broadcastperm=1;

if(setsockopt(sock、SOL_SOCKET、SO_BROADCAST和broadcastperm、sizeof(broadcastperm))我不认为发送ICMP错误是为了响应广播消息。那么主机如何响应呢?它们只有在端口上运行服务器时才会响应。数据报被发送到服务器,它会正常响应。好的。因此,我应该将ICMP数据包发送到子网中可能的每个IP,然后检查端口是否无法访问,而不是使用UDP进行广播e错误?是的,这是现在的
nmap
工作。我不认为发送ICMP错误是为了响应广播消息。那么主机如何响应?它们只有在端口上运行服务器时才会响应。数据报被发送到服务器,并且它会正常响应。好的。因此,我应该向每个IP发送ICMP数据包,而不是使用UDP进行广播吗在子网中,然后检查端口不可访问错误?是的,现在
nmap
工作了。