Linux网络编程之广播通信代码实例
目的:
服务器端广播发送一个文件
现象:
服务器端循环发送一个文件,客户端持续接收文件。
<服务器端或客户端谁先运行均可,文件名由命令行指定>
eg. ./server server.c
./clent
服务器端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <time.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#define LEN 256
int main(int argc, char **argv)
{
struct sockaddr_in server_socket;
int sockfd = 0;
int on = 1;
int num = 0;
char msg[LEN] = {0};
if (argc < 2)
{
perror("Usage error: need a filename\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("socket():Create socket fails!\n");
exit(1);
}
//设置套接字为广播模式 SO_BROADCAST
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
memset(&server_socket,0,sizeof(server_socket));
server_socket.sin_family = AF_INET;
//inet_pton是一个IP地址转换函数,可以在将点分文本的IP地址转换为二进制网络字节序”的IP地址
if (inet_pton(AF_INET, "255.255.255.255", &server_socket.sin_addr) <= 0)
{
perror("inet_pton():IP address is error!\n");
exit(1);
}
server_socket.sin_port = htons(1234);
int fd;
int len;
fd = open(argv[1],O_RDONLY);
if(fd == -1)
{
perror("open failed\n");
exit(1);
}
char begin_signal[LEN]="\n\n\n\n\n**********new transmission begin!**********\n\n\n\n\n";
while(1)
{
sendto(sockfd, begin_signal, strlen(begin_signal), 0, (struct sockaddr *)&server_socket, sizeof(struct sockaddr_in));
while((len = read(fd,msg,10)) > 0)
{
sendto(sockfd, msg, len, 0, (struct sockaddr *)&server_socket, sizeof(struct sockaddr_in));
}
lseek(fd,0,SEEK_SET); //移动读指针至文件起始位置
sleep(3);
}
close(fd);
close(sockfd);
exit(0);
}
客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <time.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define LEN 256
int main(int argc, char **argv)
{
struct sockaddr_in client_socket;
int sockfd = 0;
int num = 0;
char msg[LEN] = {0};
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("socket():Create socket fails!\n");
exit(1);
}
memset(&client_socket, 0, sizeof(client_socket));
client_socket.sin_family = AF_INET;
client_socket.sin_port = htons(1234);
client_socket.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY参考https://blog.csdn.net/jeffasd/article/details/51461568
int opt = SO_REUSEADDR;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if (bind(sockfd, (struct sockaddr *)&client_socket, sizeof(struct sockaddr_in)) < 0)
{
perror("bind():bind fails!\n");
exit(1);
}
while(1) //这里不使用while(1)依然可以持续接收
{
while((num = read(sockfd, msg, LEN)) > 0)
write(1,msg,num);
}
close(sockfd);
exit(0);
}
代码参考:https://blog.csdn.net/Travelerwz/article/details/82655292