#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#define LOCALPORT 5555
#define LOCALIP "145.192.1.68"
#define LEN 1400
// int main()
// {
// //SOCK_DGRAM表示使用的是UDP协议
// int sockfd = socket(AF_INET,SOCK_DGRAM,0);
// assert(sockfd != -1);
// struct sockaddr_in ser_addr;
// memset(&ser_addr,0,sizeof(ser_addr));
// ser_addr.sin_family = AF_INET;
// //将主机字节序转化为网络字节序
// // uint16_t port = 5555;
// ser_addr.sin_port = htons(LOCALPORT);
// //将点分十进制的地址字符串转为unit32类型的值
// // ser_addr.sin_addr.s_addr = inet_addr(LOCALIP);
// ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// int res = bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
// if(res == -1)
// {
// printf("bind fail !\n");
// return -1;
// }
// //循环接受不同客户端的数据
// while(1)
// {
// char buff[LEN] = {0};
// struct sockaddr_in cli_addr;
// socklen_t cli_len = sizeof(cli_addr);
// int n = recvfrom(sockfd,buff,LEN,0,(struct sockaddr*)&cli_addr,&cli_len);
// if(n < 0)
// {
// printf("recvfrom data error\n");
// break;
// }
// printf("peer ip: %s peer port: %d recvData: %s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buff);
// // n = sendto(sockfd,"OK",2,0,(struct sockaddr*)&cli_addr,cli_len);
// // if(n <= 0)
// // {
// // break;
// // }
// }
// close(sockfd);
// exit(0);
// }
// 发送端
// #include <iostream>
// #include <stdio.h>
// #include <sys/socket.h>
// #include <unistd.h>
// #include <sys/types.h>
// #include <netdb.h>
// #include <netinet/in.h>
// #include <arpa/inet.h>
// #include <string.h>
// using namespace std;
// int main()
// {
// setvbuf(stdout, NULL, _IONBF, 0);
// fflush(stdout);
// int sock = -1;
// if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
// {
// cout<<"socket error"<<endl;
// return false;
// }
// const int opt = 1;
// //设置该套接字为广播类型,
// int nb = 0;
// nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
// if(nb == -1)
// {
// cout<<"set socket error..."<<endl;
// return false;
// }
// struct sockaddr_in addrto;
// bzero(&addrto, sizeof(struct sockaddr_in));
// addrto.sin_family=AF_INET;
// // addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);
// addrto.sin_addr.s_addr = inet_addr("255.255.255.255");
// addrto.sin_port=htons(5555);
// int nlen=sizeof(addrto);
// printf("-----------------------\n");
// while(1)
// {
// sleep(1);
// //从广播地址发送消息
// char smsg[] = {"abcdef"};
// int ret=sendto(sock, smsg, strlen(smsg), 0, (sockaddr*)&addrto, nlen);
// if(ret<0)
// {
// cout<<"send error...."<<ret<<endl;
// }
// else
// {
// printf("ok ");
// }
// }
// return 0;
// }
// #include <string>
// #include <stdlib.h>
// #include <string.h>
// #include <sys/types.h>
// #include <unistd.h>
// #include <sys/socket.h>
// #include <netdb.h>
// #include <arpa/inet.h>
// #include <netinet/in.h>
// #include <iostream>
// int main(void)
// {
// int sck = socket(AF_INET,SOCK_DGRAM,0);
// char arrRcv[1024];
// if(sck >=0){
// int iOn = 1;
// std::cout<<"join brdcst"<<setsockopt(sck, SOL_SOCKET, SO_BROADCAST, &iOn, sizeof(int))
// <<std::endl;
// struct sockaddr_in local_addr;
// memset(&local_addr, 0, sizeof(local_addr));
// local_addr.sin_family=AF_INET;
// local_addr.sin_addr.s_addr=htonl(INADDR_BROADCAST);//have to do this otherwise can't recv broadcast on linux
// local_addr.sin_port=htons(5555);
// int err = ::bind(sck,(struct sockaddr*)&local_addr,sizeof(local_addr));
// if(0 == err)
// {
// std::cout<<"bind succ"<<std::endl;
// while (1)
// {
// int iRcvLen = recv(sck, arrRcv, 1024, 0);
// if(iRcvLen > 0){
// printf("recv = %s\n",arrRcv);
// } else if(iRcvLen < 0) {
// break;
// }
// sleep(1);
// //从广播地址发送消息
// char smsg[] = {"abcdef"};
// int ret=sendto(sck, smsg, strlen(smsg), 0, (sockaddr*)&local_addr, sizeof(local_addr));
// if(ret<0)
// {
// std::cout<<"send error...."<<ret<<std::endl;
// }
// else
// {
// printf("send sucess %s\n",smsg);
// }
// }
// }
// }
// return 0;
// }
// #include <stdio.h>
// #include <string.h>
// #include <stdlib.h>
// #include <unistd.h>
// #include <sys/socket.h>
// #include <netinet/in.h>
// #include <sys/types.h>
// #include <arpa/inet.h>
// int main(){
// char msg[128] = "I am broadCast message from server!";
// struct sockaddr_in saddr, caddr;
// socklen_t slen, clen;
// int lfd, ret;
// lfd = socket(PF_INET, SOCK_DGRAM, 0);
// if(lfd < 0){
// perror("socket create error");
// exit(1);
// }
// int flag = 1;
// setsockopt(lfd, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &flag, sizeof(flag) );
// caddr.sin_family = AF_INET;
// caddr.sin_port = htons(5555);
// caddr.sin_addr.s_addr = inet_addr("255.255.255.255");
// clen = sizeof(caddr);
// while (1)
// {
// sleep(1);
// int n = sendto(lfd, msg, strlen(msg), 0, (struct sockaddr *)&caddr, clen);
// if(n < 0){
// perror("sendto Error:");
// exit(1);
// } else {
// printf("n = %d\n",n);
// }
// }
// close(lfd);
// return 0;
// }
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <net/if.h>
#define SERVER_PORT 5555 /* 无关紧要 */
#define MAXLINE 1500
#define BROADCAST_IP "255.255.255.255"
#define CLIENT_PORT 3333 /* 重要 */
int main(void)
{
int sockfd;
struct sockaddr_in serveraddr, clientaddr;
char buf[MAXLINE];
/* 构造用于UDP通信的套接字 */
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET; /* IPv4 */
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /* 本地任意IP INADDR_ANY = 0 */
serveraddr.sin_port = htons(SERVER_PORT);
bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
int flag = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(flag));
/*构造 client 地址 IP+端口 192.168.7.255+9000 */
bzero(&clientaddr, sizeof(clientaddr));
clientaddr.sin_family = AF_INET;
inet_pton(AF_INET, BROADCAST_IP, &clientaddr.sin_addr.s_addr);
clientaddr.sin_port = htons(CLIENT_PORT);
int i = 0;
while (1) {
sprintf(buf, "Drink %d glasses of water\n", i++);
//fgets(buf, sizeof(buf), stdin);
sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&clientaddr, sizeof(clientaddr));
sleep(1);
char arrRcv[1024];
int iRcvLen = recv(sockfd, arrRcv, 1024, 0);
if(iRcvLen > 0){
printf("recv = %s\n",arrRcv);
} else if(iRcvLen < 0) {
break;
}
}
close(sockfd);
return 0;
}
linux c广播收发
原创
©著作权归作者所有:来自51CTO博客作者XYG_XT的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章