C 使用UDP广播的主机发现
我正试图在C中编写一个程序,通过UDP协议进行广播,然后计算ICMP\u端口无法访问的消息数,来发现我的子网上的主机 我的代码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
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
工作了。