//发送端代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <error.h>
#include <stdlib.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
struct sockaddr_in s_addr;//结构体
int sock;
int addr_len;//获取结构长度
int len;
char buff[128];
int yes;
if (argc != 2)
{
printf("Please input %s IP\n",argv[1]);
}
if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0))){ //以UDP方式创建socket
perror("socket");
exit(EXIT_FAILURE);
}
else
printf("create socket.\n\r");
yes = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes)); //设置socket为可发送广播消息
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(7838);//指定接收广播消息的端口
if(argv[1]){
s_addr.sin_addr.s_addr = inet_addr(argv[1]); //argv[1] 为广播消息的目的地址,即广播地址
}
else{
printf("input server IP!\n");
exit(0);
}
addr_len = sizeof(s_addr);
strcpy(buff, "hello message");
// while(1){
int i;
for(i=0; ; i++){
len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*)&s_addr, addr_len); //使用UDP广播的消息
if(len < 0){
printf("\n\rsend error.\n\r");
exit(EXIT_FAILURE);
}
sleep(1);
printf("send success %d:\tsend message is %s\n",i,&buff);
}
return 0;
}
接受端代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <error.h>
#include <stdlib.h>
#include <arpa/inet.h>
#define MAXSIZE 128
int main(int argc, char* argv[])
{
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
int sock;
socklen_t addr_len;
int len;
char buff[MAXSIZE];
if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0))){
perror("socket");
exit(EXIT_FAILURE);
}
else
printf("create socket success\n");
memset(&s_addr, 0 , sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(7838);
s_addr.sin_addr.s_addr = INADDR_ANY; //指示接收的数据IP,必须为此值,因为是广播,接收地址任意
if(-1 == (bind(sock, (struct sockaddr*)&s_addr, sizeof(s_addr)))){
perror("bind");
exit(EXIT_FAILURE);
}
else{
printf("bind address to socket.\n");
}
addr_len = sizeof(c_addr);
while(1){
len = recvfrom(sock, buff,sizeof(buff)-1, 0, (struct sockaddr*)&c_addr, &addr_len);//从服务端接收数据
if(len < 0){
perror("recvfrom failed...");
exit(EXIT_FAILURE);
}
buff[len]= '\0';
printf("receive come from %s:%d message:%s\n",inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port),buff);
}
return 0;
}