一、广播
1.接收
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define IP "192.168.138.255" //服务器 IP
#define PORT 8888 //端口号
#define MAX 128
#define ERROR(msg) do{\
fprintf(stderr, "__%d__", __LINE__);\
perror(msg);\
}while(0)
int main(int argc, char *argv[])
{
int sfd;
char buf[MAX] = "";
struct sockaddr_in server_addr;
//1.创建流式套接字
sfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sfd == -1)
{
ERROR("socket");
return -1;
}
//填充地址信息结构体
memset(&server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT); //端口的网络字节序
server_addr.sin_addr.s_addr = inet_addr(IP); //IP的网络字节序
//允许端口快速被重用
int reuse = 1;
if(setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &reuse ,sizeof(reuse)) < 0)
{
ERROR("setsockopt");
return -1;
}
//2.将地址信息绑定到套接字上
if (bind(sfd, (struct sockaddr *) &server_addr,
sizeof(struct sockaddr_in)) == -1)
{
ERROR("bind");
return -1;
}
ssize_t res;
while(1)
{
bzero(buf, sizeof(buf));
//接收信息
res = recvfrom(sfd, buf, sizeof(buf), 0, NULL,0);
if(res < 0)
{
ERROR("recvfrom");
return -1;
}
printf(":%s\n", buf);
}
close(sfd);
return 0;
}
2.发送
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define SERVER_IP "192.168.138.255" //服务器 IP
#define SERVER_PORT 8888 //服务器端口号
#define MAX 128
#define ERROR(msg) do{\
fprintf(stderr, "__%d__", __LINE__);\
perror(msg);\
}while(0)
int main(int argc, char *argv[])
{
int cfd,sfd;
struct sockaddr_in server_addr;
socklen_t server_addr_size;
//1.创建数据报式套接字
cfd = socket(AF_INET, SOCK_DGRAM, 0);
if (cfd == -1)
{
ERROR("socket");
return -1;
}
//2.允许广播
int on=1;
if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR | SO_BROADCAST,&on,sizeof(on)) < 0)
{
ERROR("setsockopt");
return -1;
}
//3.填充服务器地址信息结构体
memset(&server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT); //端口的网络字节序
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); //IP的网络字节序
char buf[MAX] = "";
ssize_t res = 0;
server_addr_size = sizeof(struct sockaddr_in);
while(1)
{
bzero(buf, sizeof(buf));
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf)-1] = '\0';
//5.发送信息
if(sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&server_addr, server_addr_size) < 0)
{
ERROR("sendto");
return -1;
}
}
}
二、组播
1.接收
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <unistd.h>
#include <string.h>
#define IP "224.255.255.255" //组 IP
#define PORT 8888 //端口号
#define LOC_IP "192.168.138.101"
#define MAX 128
#define ERROR(msg) do{\
fprintf(stderr, "__%d__", __LINE__);\
perror(msg);\
}while(0)
int main(int argc, char *argv[])
{
int sfd;
char buf[MAX] = "";
struct sockaddr_in rec_addr;
//1.创建流式套接字
sfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sfd == -1)
{
ERROR("socket");
return -1;
}
//加入多播组
struct ip_mreqn ip_addr;
ip_addr.imr_multiaddr.s_addr = inet_addr(IP); //组播IP
ip_addr.imr_address.s_addr = inet_addr(LOC_IP); //本机IP
ip_addr.imr_ifindex = 2; //设备索引号
socklen_t size = sizeof(ip_addr);
if(setsockopt(sfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ip_addr,size) < 0)
{
ERROR("setsockopt");
return -1;
}
//填充地址信息结构体
memset(&rec_addr, 0, sizeof(struct sockaddr_in));
rec_addr.sin_family = AF_INET;
rec_addr.sin_port = htons(PORT); //端口的网络字节序
rec_addr.sin_addr.s_addr = inet_addr(IP); //IP的网络字节序
//2.将地址信息绑定到套接字上
if (bind(sfd, (struct sockaddr *) &rec_addr,
sizeof(struct sockaddr_in)) == -1)
{
ERROR("bind");
return -1;
}
ssize_t res;
while(1)
{
bzero(buf, sizeof(buf));
//接收信息
res = recvfrom(sfd, buf, sizeof(buf), 0, NULL,0);
if(res < 0)
{
ERROR("recvfrom");
return -1;
}
printf(":%s\n", buf);
}
close(sfd);
return 0;
}
2.发送
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define IP "224.255.255.255" //组ip
#define PORT 8888 //服务器端口号
#define MAX 128
#define ERROR(msg) do{\
fprintf(stderr, "__%d__", __LINE__);\
perror(msg);\
}while(0)
int main(int argc, char *argv[])
{
int sfd;
struct sockaddr_in send_addr;
socklen_t send_addr_size;
//1.创建数据报式套接字
sfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sfd == -1)
{
ERROR("socket");
return -1;
}
//2.填充组播地址信息结构体
memset(&send_addr, 0, sizeof(struct sockaddr_in));
send_addr.sin_family = AF_INET;
send_addr.sin_port = htons(PORT); //端口的网络字节序
send_addr.sin_addr.s_addr = inet_addr(IP); //IP的网络字节序
char buf[MAX] = "";
ssize_t res = 0;
send_addr_size = sizeof(struct sockaddr_in);
while(1)
{
bzero(buf, sizeof(buf));
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf)-1] = '\0';
//5.发送信息
if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&send_addr, send_addr_size) < 0)
{
ERROR("sendto");
return -1;
}
}
close(sfd);
}