我正在尝试在 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);
}
}
我在这段代码中基本上做的是: -
我在此代码中的问题是在recvfrom阻止并且没有收到其他主机的回复。
如果这个问题是由于套接字没有连接,那么它可能没有收到ICMP错误,但是当我尝试将套接字连接到255.255.255.255之后,套接字也没有收到任何回复,但只有阻止。