📄 mcast.cc
字号:
#include "queue.h"#include "kbd.h"#include <fcntl.h> // fcntl#include <sys/socket.h>#include <netinet/in.h> // sockaddr_in#include <arpa/inet.h>#include <netdb.h>#include <netinet/ip.h> // iphdr#include <netinet/udp.h> // udphdr#include <unistd.h> // getpid#include <stdio.h> // printf/*#include <net/if.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>*/extern queue* q;extern int ms; // multicast socketextern struct sockaddr_in to;extern u_int id;int init_mcast_socket(){ struct sockaddr_in sin; // address for bind sin.sin_addr.s_addr = htonl( INADDR_ANY ); sin.sin_port = htons( 9876 ); ms = socket( PF_INET, SOCK_DGRAM, 0 ); int flags = fcntl( ms, F_GETFL, 0 ); if( flags == -1 ) printf( "bad flags.\n" ); fcntl( ms, F_SETFL, flags | O_ASYNC | O_NONBLOCK ); fcntl( ms, F_SETOWN, getpid() ); int msock_reuse = 1; setsockopt( ms, SOL_SOCKET, SO_REUSEADDR, &msock_reuse, sizeof( int ) ); bind( ms, ( struct sockaddr* )&sin, sizeof( sin ) ); u_char msock_ttl = 4; setsockopt( ms, IPPROTO_IP, IP_MULTICAST_TTL, &msock_ttl, sizeof( u_char ) ); u_char msock_loop = 1; setsockopt( ms, IPPROTO_IP, IP_MULTICAST_LOOP, &msock_loop, sizeof( u_char ) ); struct ip_mreq mreq; // multicast request struct hostent* multi = gethostbyname( "224.4.78.1" ); mreq.imr_multiaddr.s_addr = *( u_int* )( multi -> h_addr );// struct hostent* local = gethostbyname( "192.168.0.1" ); mreq.imr_interface.s_addr = INADDR_ANY;// mreq.imr_interface.s_addr = *( u_int* )local -> h_addr; to.sin_addr = mreq.imr_multiaddr; to.sin_port = htons( 9876 ); to.sin_family = AF_INET; printf( "address: %s:%d\r\n", inet_ntoa( mreq.imr_multiaddr ), 9876 ); fflush( stdout ); if( setsockopt( ms, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof( mreq ) ) < 0 ) printf( "failed\n" ); return ms;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -