linuxC语言socket广播通信

来源:互联网 发布:淘宝上的彩妆正品店 铺 编辑:程序博客网 时间:2024/05/16 18:20
 广播:  发送给所有主机
// 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 80void 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 80void 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 BROADCASTint 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

0 0