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;
}

IPv6b

YouTube�`�����l������Ă܂��I