23,118
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <sys/time.h>
#define MAX_LENGTH 5 * 1024 * 1024
#define PORT 8000
#define GROUP "239.1.1.1"
int main()
{
struct sockaddr_in server, client;
struct ip_mreq mreq;
unsigned char buf[MAX_LENGTH];
int fd, sinSize, recvlength;
fd_set readfds;
int ret;
struct timeval timeout = {3, 0};
memset(&server, 0, sizeof(struct sockaddr_in));
memset(&client, 0, sizeof(struct sockaddr_in));
memset(&mreq, 0, sizeof(struct ip_mreq));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
if (inet_aton(GROUP, &server.sin_addr) < 0) {
perror("inet_aton");
return -1;
}
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
return -1;
}
if (bind(fd, (struct sockaddr *) &server, sizeof(server)) < 0) {
perror("bind");
return -1;
}
if (inet_aton(GROUP, &mreq.imr_multiaddr) < 0) {
perror("inet_aton mreq.imr_multiaddr");
return -1;
}
inet_aton("192.168.180.170", &(mreq.imr_interface));
if (setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
perror("setsockopt");
return -1;
}
sinSize = sizeof(client);
FILE *fp;
fp = fopen("./recv1.2.ts", "ab+");
while (1) {
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
if ((ret = select(fd + 1, &readfds, NULL, NULL, &timeout)) < 0)
break;
else if(ret == 0)
continue;
else {
if (FD_ISSET(fd, &readfds) == 0)
continue;
recvlength = recvfrom(fd, buf, MAX_LENGTH, 0, (struct sockaddr *) &client, &sinSize);
if (recvlength < 0) {
perror("receive");
continue;
}
fwrite(buf, sizeof(unsigned char), recvlength, fp);
fflush(fp);
}
}
}