UDP�Ń}���`�L���X�g���g��
�����ł́AUDP�Ń}���`�L���X�g�p�P�b�g�𑗂���@������������Ǝv���܂��B
�}���`�L���X�g���M�T���v��
�܂��́A�}���`�L���X�g�𑗐M����T���v�����ȉ��Ɏ����܂��B ���̃T���v���ł�winsock2.h�����łȂ�ws2tcpip.h�Ƃ����t�@�C����include���Ă���̂Œ��ӂ��Ă��������B ws2tcpip.h��IP_MULTICAST_IF��struct ip_mreq�Ȃǂ��錾����Ă��܂��B
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
int
main()
{
WSAData wsaData;
SOCKET sock;
struct sockaddr_in addr;
DWORD ipaddr;
WSAStartup(MAKEWORD(2,0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.S_un.S_addr = inet_addr("239.192.1.2");
ipaddr = inet_addr("127.0.0.1");
if (setsockopt(sock,
IPPROTO_IP,
IP_MULTICAST_IF,
(char *)&ipaddr, sizeof(ipaddr)) != 0) {
printf("setsockopt : %d\n", WSAGetLastError());
return 1;
}
sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr));
closesocket(sock);
WSACleanup();
return 0;
}
��L��̂悤��setsockopt���s��Ȃ��Ă��Astruct sockaddr_in�ɐݒ肷�鈶����}���`�L���X�g�A�h���X�ɂ��邾���Ń}���`�L���X�g�p�P�b�g�̑��M�͍s���܂��B �������A�����C���^�[�t�F�[�X������@��ł͏o�̓C���^�[�t�F�[�X���w�肵�Ȃ��ƈӐ}���Ȃ��C���^�[�t�F�[�X����}���`�L���X�g�p�P�b�g���o�Ă��܂��܂��B ���̂��߁A�ʓ|�ł�IP_MULTICAST_IF�͐ݒ肵�Ă������Ƃ������߂������܂��B IP_MULTICAST_IF�œ���̃l�b�g���[�N�C���^�[�t�F�[�X���w�肷��ɂ́A���̃l�b�g���[�N�C���^�[�t�F�[�X�ɐݒ肳�ꂽIP�A�h���X�𗘗p���܂��B ��L��ł́A127.0.0.1�i���[�J���z�X�g�j�Ƃ����l�b�g���[�N�C���^�[�t�F�[�X���w�肵�Ă��܂��B
�}���`�L���X�g��M�T���v��
���ɁA�}���`�L���X�g����M����T���v�����ȉ��Ɏ����܂��B �ȉ��̃T���v���́A�O�q�����}���`�L���X�g���M�T���v������̃p�P�b�g�����܂��B
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
int
main()
{
WSAData wsaData;
SOCKET sock;
struct sockaddr_in addr;
struct ip_mreq mreq;
char buf[2048];
WSAStartup(MAKEWORD(2,0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
bind(sock, (struct sockaddr *)&addr, sizeof(addr));
// setsockopt�́Abind�ȍ~�ōs���K�v����
memset(&mreq, 0, sizeof(mreq));
mreq.imr_interface.S_un.S_addr = INADDR_ANY;
mreq.imr_multiaddr.S_un.S_addr = inet_addr("239.192.1.2");
if (setsockopt(sock,
IPPROTO_IP,
IP_ADD_MEMBERSHIP,
(char *)&mreq, sizeof(mreq)) != 0) {
printf("setsockopt : %d\n", WSAGetLastError());
return 1;
}
memset(buf, 0, sizeof(buf));
recv(sock, buf, sizeof(buf), 0);
printf("%s\n", buf);
closesocket(sock);
WSACleanup();
return 0;
}
�}���`�L���X�g�p�P�b�g�����ɂ́A�}���`�L���X�g�O���[�v�Ɂu�Q���iJOIN�j�v���Ȃ��Ă͂Ȃ�܂���B �}���`�L���X�g�O���[�v�ւ̎Q���́Asetsockopt�𗘗p���čs���܂��B setsockopt�𗘗p����|�C���g�Ƃ��ẮAbind���s������ɍs���K�v�����邱�Ƃ��������܂��B �}���`�L���X�g�O���[�v�ւ̎Q�����s�����߂ɂ́A�Q������O���[�v��\���}���`�L���X�g�A�h���X�Ɨ��p����l�b�g���[�N�C���^�[�t�F�[�X���w�肵�Ȃ��Ă͂Ȃ�܂���B �l�b�g���[�N�C���^�[�t�F�[�X��INADDR_ANY���w�肷�邱�Ƃɂ��A�����I�ɗ��p����l�b�g���[�N�C���^�[�t�F�[�X���w�肵�Ȃ����Ƃ��o���܂��B �������Abind���s�����l�b�g���[�N�C���^�[�t�F�[�X��IP_ADD_MEMBERSHIP��INADDR_ANY�Ŏw�肵���Ƃ��̃l�b�g���[�N�C���^�[�t�F�[�X����v����ۏ�͂���܂���B
��xJOIN�����}���`�L���X�g�O���[�v����u�E�ށiLEAVE�j�v����ɂ́Asetsockopt��IP_DROP_MEMBERSHIP�ōs���܂��B
���[�J���R���s���[�^��IP�A�h���X�擾
�}���`�L���X�g���M�C���^�[�t�F�[�X��}���`�L���X�g��M�C���^�[�t�F�[�X��ݒ肷�邽�߂ɂ́A���[�J���R���s���[�^�ɑ��݂���IP�A�h���X���擾����K�v������܂��B winsock�ɂ́A���̂悤�ȋ@�\�͂���܂���B ���̂��߁Awinsock�ȊO�̕��@���g����IP�A�h���X��C���^�[�t�F�[�X�̏����擾���Ȃ��Ă͂Ȃ�܂���B Windows�ł́A���̂悤�ȏ����擾������@�Ƃ���IP Helper API����Ă��܂��B IP Helper API�̎g�����Ɋւ��Ă����������������������B
TTL�̐ݒ�
Windows�̏����ݒ�ł́A�}���`�L���X�g�p�P�b�g��TTL 1�ő��M����܂��B ���[�J���Z�O�����g�����Ń}���`�L���X�g���p���A���[�^���z����K�v���Ȃ��ꍇ�ɂ͖��͂���܂��A���[�^���z����}���`�L���X�g���s�������ꍇ�ɂ͖�肪�������܂��B �ȉ��ɁATTL�̐ݒ��������܂��B
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
int
main()
{
WSAData wsaData;
SOCKET sock;
struct sockaddr_in addr;
DWORD ipaddr;
int ttl = 10;
WSAStartup(MAKEWORD(2,0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.S_un.S_addr = inet_addr("239.192.1.2");
ipaddr = inet_addr("127.0.0.1");
if (setsockopt(sock,
IPPROTO_IP,
IP_MULTICAST_IF,
(char *)&ipaddr, sizeof(ipaddr)) != 0) {
printf("setsockopt : %d\n", WSAGetLastError());
return 1;
}
if (setsockopt(sock,
IPPROTO_IP,
IP_MULTICAST_TTL,
(char *)&ttl,
sizeof(ttl)) != 0) {
printf("setsockopt : %d\n", WSAGetLastError());
return 1;
}
sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr));
closesocket(sock);
WSACleanup();
return 0;
}