Broadcast: As the name implies, you can send your own data to everyone within a specific range; the broadcast in our network programming generally sends your own data to the currently online client in the LAN through a specific broadcast address
We can use the command to view our current broadcast address under Linux: ifconfig
We only need to send data to this broadcast address, and other online clients in the current LAN can receive this information
code:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
int broadcast_send ( int port)
{
int sockfd = socket ( AF_INET, SOCK_DGRAM, 0 ) ;
if ( sockfd < 0 )
{
perror ( "socket error" ) ;
return - 1 ;
}
int on= 1 ;
int ret = setsockopt ( sockfd, SOL_SOCKET, SO_BROADCAST, & on, sizeof ( on) ) ;
if ( ret < 0 )
{
perror ( "setsockopt error" ) ;
goto err;
}
char buffer[ ] = "hello world" ;
struct sockaddr_in dest_addr;
memset ( & dest_addr, 0 , sizeof ( dest_addr) ) ;
dest_addr. sin_family = AF_INET;
dest_addr. sin_port = htons ( port) ;
dest_addr. sin_addr. s_addr = inet_addr ( "192.168.19.255" ) ;
ret = sendto ( sockfd, buffer, sizeof ( buffer) , 0 , ( struct sockaddr* ) & dest_addr, sizeof ( dest_addr) ) ;
if ( ret < 0 )
{
perror ( "sendto error" ) ;
goto err;
}
err:
close ( sockfd) ;
return 0 ;
}
int broadcast_recv ( int port)
{
int sockfd = socket ( AF_INET, SOCK_DGRAM, 0 ) ;
if ( sockfd < 0 )
{
perror ( "socket error" ) ;
return - 1 ;
}
int on= 1 ;
int rt = setsockopt ( sockfd, SOL_SOCKET, SO_REUSEADDR, & on, sizeof ( on) ) ;
if ( rt < 0 )
{
perror ( "setsockopt error" ) ;
goto recverr;
}
struct sockaddr_in src_addr;
memset ( & src_addr, 0 , sizeof ( src_addr) ) ;
src_addr. sin_family = AF_INET;
src_addr. sin_port = htons ( port) ;
src_addr. sin_addr. s_addr = htonl ( INADDR_ANY) ;
int ret = bind ( sockfd, ( struct sockaddr* ) & src_addr, sizeof ( src_addr) ) ;
if ( ret < 0 )
{
perror ( "bind error" ) ;
goto recverr;
}
char buffer[ 128 ] = {
0 } ;
struct sockaddr_in sendaddr;
socklen_t len = sizeof ( sendaddr) ;
ret = recvfrom ( sockfd, buffer, sizeof ( buffer) , 0 , ( struct sockaddr* ) & sendaddr, & len) ;
if ( ret < 0 )
{
perror ( "recvfrom error" ) ;
goto recverr;
}
printf ( "接到数据:%s\n" , buffer) ;
recverr:
close ( sockfd) ;
return 0 ;
}
int main ( int argc, char * * argv)
{
if ( argc >= 2 && strcmp ( argv[ 1 ] , "send" ) == 0 )
broadcast_send ( 9999 ) ;
if ( argc >= 2 && strcmp ( argv[ 1 ] , "recv" ) == 0 )
broadcast_recv ( 9999 ) ;
return 0 ;
}