广播
rcv.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define ERRLOG(msg) do{\
printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
perror(msg);\
exit(-1);\
}while(0)
int main(int argc, const char *argv[])
{
if(3 != argc){
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(-1);
}
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == sockfd){
ERRLOG("socket error");
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
//广播的ip地址:局域网中最大的或者 255.255.255.255
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t serveraddr_len = sizeof(serveraddr);
if(-1 == bind(sockfd, (struct sockaddr *)&serveraddr, serveraddr_len)){
ERRLOG("bind error");
}
struct sockaddr_in clientaddr;
memset(&clientaddr, 0, sizeof(clientaddr));
socklen_t clientaddr_len = sizeof(clientaddr);
char buff[128] = {0};
int nbytes = 0;
int ret = 0;
while(1){
if(-1 == (nbytes = recvfrom(sockfd, buff, 128, 0, (struct sockaddr *)&clientaddr, &clientaddr_len))){
ERRLOG("recvfrom error");
}
if(!strncmp(buff, "quit", 4)){
printf("client [%s:%d]exit !!!..\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
break;
}
printf("client [%s:%d]--->[%s]\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), buff);
}
close(sockfd);
return 0;
}
snd.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define ERRLOG(msg) do{\
printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
perror(msg);\
exit(-1);\
}while(0)
int main(int argc, const char *argv[])
{
if(3 != argc){
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(-1);
}
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == sockfd){
ERRLOG("socket error");
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
//广播的ip地址:局域网中最大的或者 255.255.255.255
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t serveraddr_len = sizeof(serveraddr);
//设置允许发送广播
int value = 1;
if(-1 == setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &value, sizeof(value))){
ERRLOG("setsockopt error");
}
char buff[128] = {0};
while(1){
fgets(buff, 128, stdin);
buff[strlen(buff)-1] = '\0';
if(-1 == sendto(sockfd, buff, 128, 0, (struct sockaddr *)&serveraddr, serveraddr_len)){
ERRLOG("send error");
}
if(!strcmp(buff, "quit")){
break;
}
}
close(sockfd);
return 0;
}
执行结果
rcv
ubuntu@ubuntu $ ./rcv 255.255.255.255 8888
client [192.168.10.133:40065]--->[a]
client [192.168.10.133:40065]--->[b]
client [192.168.10.133:40065]--->[c]
^C
ubuntu@ubuntu $
snd
ubuntu@ubuntu $ ./snd 255.255.255.255 8888
a
b
c
^C
ubuntu@ubuntu $
组播
rcv.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <net/if.h>
#define ERRLOG(msg) do{\
printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
perror(msg);\
exit(-1);\
}while(0)
int main(int argc, const char *argv[])
{
if(3 != argc){
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(-1);
}
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == sockfd){
ERRLOG("socket error");
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
//多播组的ip地址 224.0.0.1~239.255.255.255
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t serveraddr_len = sizeof(serveraddr);
if(-1 == bind(sockfd, (struct sockaddr *)&serveraddr, serveraddr_len)){
ERRLOG("bind error");
}
//设置加入多播组
struct ip_mreqn mreqn;
mreqn.imr_multiaddr.s_addr = inet_addr(argv[1]);
mreqn.imr_address.s_addr = inet_addr("192.168.10.133");
mreqn.imr_ifindex = if_nametoindex("ens33");
if(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, sizeof(mreqn)) < 0){
ERRLOG("setsockopt error");
}
struct sockaddr_in clientaddr;
memset(&clientaddr, 0, sizeof(clientaddr));
socklen_t clientaddr_len = sizeof(clientaddr);
char buff[128] = {0};
int nbytes = 0;
int ret = 0;
while(1){
if(-1 == (nbytes = recvfrom(sockfd, buff, 128, 0, (struct sockaddr *)&clientaddr, &clientaddr_len))){
ERRLOG("recvfrom error");
}
if(!strncmp(buff, "quit", 4)){
printf("client [%s:%d]exit !!!..\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
break;
}
printf("client [%s:%d]--->[%s]\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), buff);
}
close(sockfd);
return 0;
}
snd.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define ERRLOG(msg) do{\
printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
perror(msg);\
exit(-1);\
}while(0)
int main(int argc, const char *argv[])
{
if(3 != argc){
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(-1);
}
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == sockfd){
ERRLOG("socket error");
}
//填充组播信息结构体
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
//多播组的ip地址 224.0.0.1~239.255.255.255
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t serveraddr_len = sizeof(serveraddr);
char buff[128] = {0};
while(1){
fgets(buff, 128, stdin);
buff[strlen(buff)-1] = '\0';
if(-1 == sendto(sockfd, buff, 128, 0, (struct sockaddr *)&serveraddr, serveraddr_len)){
ERRLOG("send error");
}
if(!strcmp(buff, "quit")){
break;
}
}
close(sockfd);
return 0;
}
执行结果
rcv
ubuntu@ubuntu$ ./rcv 234.1.2.3 8888
client [192.168.10.133:49581]--->[1]
client [192.168.10.133:49581]--->[2]
client [192.168.10.133:49581]--->[3]
^C
ubuntu@ubuntu$
snd
ubuntu@ubuntu$ ./snd 234.1.2.3 8888
1
2
3
^C
ubuntu@ubuntu$