广播: 发送给所有主机
// enable BROADCAST
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,&on, sizeof(on));
// enable BROADCAST
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,&on, sizeof(on));
需要解析到传输层才能决定是否需要处理
SOCKET属性:
必须在socket之后 ,bind(如果有的话)之前设置
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on);
SOL_SOCKET, SO_REUSEADDR -- 地址复用
SO_BROADCAST ---- 广播属性
sockfd = socket(PF_INET, SOCK_DGRAM, 0);
// enable BROADCAST
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,&on, sizeof(on));
// 不在乎发送源的时候,就设置为 INADDR_ANY
实例:
receiver.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <poll.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define MAXSIZE 80
void usage(const char *info)
{
printf("Usage: %s <srv PORT>\n", info);
exit(0);
}
int main(int argc, char *argv[])
{
if(argc != 2)
usage(argv[0]);
int sockfd;
char buf[MAXSIZE];
struct sockaddr_in myaddr, peeraddr;
<span style="white-space:pre"> </span>//socket创建
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&myaddr, sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(atoi(argv[1]));
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
<span style="white-space:pre"> </span>//绑定
bind(sockfd, (struct sockaddr *)&myaddr, sizeof(myaddr));
socklen_t len = sizeof(peeraddr);
while(1){//接收
recvfrom(sockfd, buf, MAXSIZE,
0, (struct sockaddr *)&peeraddr, &len);//peeraddr 保存发送地址
printf("recv from [%s:%d] : %s\n",
inet_ntoa(peeraddr.sin_addr),
ntohs(peeraddr.sin_port), buf);
}
return 0;
}
sender.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <poll.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define MAXSIZE 80
void usage(const char *info)
{
printf("Usage: %s <srv IP> <srv PORT>\n", info);
exit(0);
}
int main(int argc, char *argv[])
{
if(argc != 3)
usage(argv[0]);
int sockfd;
char buf[MAXSIZE];
struct sockaddr_in peeraddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
// enable BROADCAST
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
bzero(&peeraddr, sizeof(peeraddr));
peeraddr.sin_family = AF_INET;
peeraddr.sin_port = htons(atoi(argv[2]));
peeraddr.sin_addr.s_addr = inet_addr(argv[1]);
// strncpy(buf, "This is a broadcast message!\n", MAXSIZE);
char str;
while(1){
scanf("%s",buf);
sendto(sockfd, buf, MAXSIZE, 0,
(struct sockaddr *)&peeraddr, sizeof(peeraddr));// 目标地址
sleep(1);
}
return 0;
}
使用:
启用接收端./receiver 8888
启用发送端./sender 192.168.1.11 8888
注意端口要相同,地址是接收端的地址。
发到那个端口的,都会收到。
组播:
http://blog.csdn.net/stpeace/article/details/44657671
http://blog.csdn.net/jianchaolv/article/details/7909948