广播(程序设计思路)
1. 接收端流程
(1) 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
(2) 绑定IP和端口到socket
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip);
// addr.sin_addr.s_addr = INADDR_ANY;
ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
(3) 接收
struct sockaddr_in peer_addr;
socklen_t addrlen = sizeof(peer_addr);
ret = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&peer_addr, &addrlen);
(3) 关闭
close(sockfd);
2. 发送端流程
(1) 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
(2) 设置套接字,使能广播
int on = 1;
ret = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
if (-1 == set){
}
SOL_SOCKET: 设置的选项在socket层
SO_BROADCAST: 设置是否允许广播 0 - 不能 1-可以
(3) 通过广播地址发送广播
struct sockaddr_in broad_addr;
bzero(&broad_addr, sizeof(broad_addr));
broad_addr.sin_family = AF_INET;
broad_addr.sin_port = htons(port);
broad_addr.sin_addr.s_addr = inet_addr(一定填广播(192.168.0.255));
ret = sendto(sockfd, buf, len, 0, (struct sockaddr *)&broad_addr, sizeof(broad_addr));
(4) 关闭
clos(sockfd);
1. 接收端流程
(1) 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
(2) 绑定IP和端口到socket
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip);
// addr.sin_addr.s_addr = INADDR_ANY;
ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
(3) 接收
struct sockaddr_in peer_addr;
socklen_t addrlen = sizeof(peer_addr);
ret = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&peer_addr, &addrlen);
(3) 关闭
close(sockfd);
2. 发送端流程
(1) 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
(2) 设置套接字,使能广播
int on = 1;
ret = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
if (-1 == set){
}
SOL_SOCKET: 设置的选项在socket层
SO_BROADCAST: 设置是否允许广播 0 - 不能 1-可以
(3) 通过广播地址发送广播
struct sockaddr_in broad_addr;
bzero(&broad_addr, sizeof(broad_addr));
broad_addr.sin_family = AF_INET;
broad_addr.sin_port = htons(port);
broad_addr.sin_addr.s_addr = inet_addr(一定填广播(192.168.0.255));
ret = sendto(sockfd, buf, len, 0, (struct sockaddr *)&broad_addr, sizeof(broad_addr));
(4) 关闭
clos(sockfd);
广播(代码)
一、发送端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, const char *argv[])
{
int ret ;
int on=1 ;
int sockfd;
char packet[1024];
struct sockaddr_in broad_addr;
if(argc < 3){
fprintf(stderr, "Usage : %s <>",argv[0]);
exit(EXIT_FAILURE);
}
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(-1 == sockfd){
perror("fail to socket");
exit(EXIT_FAILURE);
}
ret = setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
if(-1 == ret){
perror("fail to setsockopt");
exit(EXIT_FAILURE);
}
bzero(&broad_addr,sizeof(broad_addr));
broad_addr.sin_family = AF_INET;
broad_addr.sin_port = htons(atoi(argv[2]));
broad_addr.sin_addr.s_addr = inet_addr("192.168.0.255");
while(1){
putchar('>');
fgets(packet,sizeof(packet),stdin);
packet[strlen(packet) - 1] = '\0';
if(strcmp(packet,"quit") == 0){
break;
}
ret = sendto(sockfd,packet,sizeof(packet),0,(struct sockaddr *)&broad_addr,sizeof(broad_addr));
if(-1 == ret){
perror("fail to sendto");
exit(EXIT_FAILURE);
}
}
close(sockfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
// ./recv 192.168.2.255 8888
int main(int argc, const char *argv[])
{
int ret;
int sockfd;
char packet[1024];
struct sockaddr_in broad_addr;
struct sockaddr_in peer_addr;
socklen_t addrlen = sizeof(peer_addr);
if (argc < 3){
fprintf(stderr, "Usage: %s <broadcast ip> <port>\n", argv[0]);
exit(EXIT_FAILURE);
}
// 1. 创建报文套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd){
perror("Fail to socket.");
exit(EXIT_FAILURE);
}
// 2. 绑定广播地址和端口
bzero(&broad_addr, sizeof(broad_addr));
broad_addr.sin_family = AF_INET;
broad_addr.sin_port = htons(atoi(argv[2]));
// broad_addr.sin_addr.s_addr = inet_addr(argv[1]);
broad_addr.sin_addr.s_addr = INADDR_ANY;
ret = bind(sockfd, (struct sockaddr *)&broad_addr, sizeof(broad_addr));
if (-1 == ret){
perror("Fail to bind.");
exit(EXIT_FAILURE);
}
while (1){
// 3. 接收广播
ret = recvfrom(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&peer_addr, &addrlen);
if (-1 == ret){
perror("Fail to recvfrom.");
break;
}
packet[ret] = '\0';
printf("---------------------------------------\n");
printf("ip : %s\n", inet_ntoa(peer_addr.sin_addr));
printf("port : %d\n", ntohs(peer_addr.sin_port));
printf("recv(%d) : %s\n", ret, packet);
printf("---------------------------------------\n");
if (strcmp(packet, "quit") == 0){
break;
}
}
// 4. 关闭套接字
close(sockfd);
return 0;
}