select���g��

�����ł́Aselect���g���ĕ����̃\�P�b�g����f�[�^���󂯎����@������������Ǝv���܂��B

select

���ʂ̏�Ԃł́Aread��recvfrom�̓f�[�^����M�ł���܂Ńu���b�L���O���܂��B �\�P�b�g����‚������p���Ă��Ȃ��ꍇ�ɂ̓u���b�L���O�͔��ɕ֗��Ȃ̂ł����A�\�P�b�g�������ɂȂ�ƍ����Ă��܂��܂��B �����̃\�P�b�g�������Ƃ��A�Е��̃\�P�b�g�Ńu���b�L���O�����܂܂ɂȂ��Ă��܂��Ƒ��̃\�P�b�g�Ƀf�[�^���������Ă���M���o���Ȃ��Ȃ��Ă��܂��܂��B ���̂��߁A�����̃\�P�b�g�������Ă���ƁA�ǂ̃\�P�b�g����f�[�^����M�”\���m�肽���Ȃ�܂��B

�u���b�L���O�Ƃ́A�֐����Ԃ��Ă��Ȃ�����\���܂��B �Ⴆ�΁Aread�̓f�[�^����M���Ċ֐����߂��Ă��܂��B ��������ς���ƁA�f�[�^����M����܂Ńu���b�N���Ă��܂��B read��recvfrom���u���b�L���O���Ȃ��m���u���b�L���O�����Ŏg�������”\�ł����A�����ł̓u���b�L���O�����̂܂܎g�����@��������܂��B

���̂悤�ȋ@�\��񋟂���̂�select�ł��B select���g���ƁA�f�[�^����M�”\�ȃ\�P�b�g�ł̂�read��recvfrom�����s���邱�Ƃ��ł��܂��B select�͓o�^�����\�P�b�g���u���b�L���O��ԂŊĎ����A�ǂꂩ���f�[�^��M����ƃu���b�L���O��Ԃ��������܂��B

select���g���T���v���R�[�h

select�͎�M�”\���ǂ��������ł͂Ȃ��A���M�”\���ǂ����A�G���[�����邩�Ȃǂ��`�F�b�N�ł��܂��������ł͎�M�”\���ǂ������`�F�b�N������@�݂̂��Ƃ肠���܂��B

���L�T���v���R�[�h�ł́AUDP�\�P�b�g��2�쐬���Ă��܂��B �쐬����2�‚�UDP�\�P�b�g�́Aselect�ɓo�^����select�̓u���b�L���O��Ԃɓ���܂��B UDP�\�P�b�g�Ƀf�[�^�����������recv���s���A��M�������e��\�����܂��B


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int
main()
{
 int sock1, sock2;
 struct sockaddr_in addr1, addr2;
 fd_set fds, readfds;
 char buf[2048];

 /* �t�@�C���f�B�X�N���v�^�̍ő�l���v�Z���܂��Bselect�Ŏg���܂� */
 int maxfd;

 /* ��M�\�P�b�g��2���܂� */
 sock1 = socket(AF_INET, SOCK_DGRAM, 0);
 sock2 = socket(AF_INET, SOCK_DGRAM, 0);

 addr1.sin_family = AF_INET;
 addr2.sin_family = AF_INET;

 addr1.sin_addr.s_addr = inet_addr("127.0.0.1");
 addr2.sin_addr.s_addr = inet_addr("127.0.0.1");

 /* 2�‚̕ʁX�̃|�[�g�ő҂‚��߂ɕʂ̃|�[�g�ԍ������ꂼ��ݒ肵�܂� */
 addr1.sin_port = htons(11111);
 addr2.sin_port = htons(22222);

 /* 2�‚̕ʁX�̃|�[�g�ő҂‚悤��bind���܂� */
 bind(sock1, (struct sockaddr *)&addr1, sizeof(addr1));
 bind(sock2, (struct sockaddr *)&addr2, sizeof(addr2));

 /* fd_set�̏��������܂� */
 FD_ZERO(&readfds);

 /* select�ő҂“ǂݍ��݃\�P�b�g�Ƃ���sock1��o�^���܂� */
 FD_SET(sock1, &readfds);
 /* select�ő҂“ǂݍ��݃\�P�b�g�Ƃ���sock2��o�^���܂� */
 FD_SET(sock2, &readfds);

 /* select�ŊĎ�����t�@�C���f�B�X�N���v�^�̍ő�l���v�Z���܂� */
 if (sock1 > sock2) {
   maxfd = sock1;
 } else {
   maxfd = sock2;
 }

 /*
   �������[�v�ł�
   ���̃T���v���ł́A���̖������[�v�𔲂��܂���
 */
 while (1) {
	/* �ǂݍ��ݗpfd_set�̏����� */
	/* select��������e���㏑�����Ă��܂��̂ŁA���񏉊������܂� */
	memcpy(&fds, &readfds, sizeof(fd_set));

	/* fds�ɐݒ肳�ꂽ�\�P�b�g���ǂݍ��݉”\�ɂȂ�܂ő҂��܂� */
        /* ��–ڂ̈����̓t�@�C���f�B�X�N���v�^�̍ő�l�{�P�ɂ��܂� */
	select(maxfd+1, &fds, NULL, NULL, NULL);

	/* sock1�ɓǂݍ��݉”\�f�[�^������ꍇ */
	if (FD_ISSET(sock1, &fds)) {
		/* sock1����f�[�^����M���ĕ\�����܂� */
		memset(buf, 0, sizeof(buf));
		recv(sock1, buf, sizeof(buf), 0);
		printf("%s\n", buf);
	}

	/* sock2�ɓǂݍ��݉”\�f�[�^������ꍇ */
	if (FD_ISSET(sock2, &fds)) {
		/* sock2����f�[�^����M���ĕ\�����܂� */
		memset(buf, 0, sizeof(buf));
		recv(sock2, buf, sizeof(buf), 0);
		printf("%s\n", buf);
	}
 }

 /* ���̃T���v���ł́A�����ւ͓��B���܂��� */
 close(sock1);
 close(sock2);

 return 0;
}

select���g���T���v���R�[�h�Ƀf�[�^�𑗐M����R�[�h

select�̃T���v���R�[�h�́AUDP��11111�Ԃ�22222�Ԃ̃|�[�g�Ńf�[�^��҂��Ă��܂��B UDP���g����11111�Ԃ�22222�ԃ|�[�g�Ƀf�[�^�𑗐M����T���v�����ȉ��Ɏ����܂��B


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int
main()
{
 int sock;
 struct sockaddr_in dest1, dest2;
 char buf[1024];

 sock = socket(AF_INET, SOCK_DGRAM, 0);

 dest1.sin_family = AF_INET;
 dest2.sin_family = AF_INET;

 dest1.sin_addr.s_addr = inet_addr("127.0.0.1");
 dest2.sin_addr.s_addr = inet_addr("127.0.0.1");

 dest1.sin_port = htons(11111);
 dest2.sin_port = htons(22222);

 memset(buf, 0, sizeof(buf));
 snprintf(buf, sizeof(buf), "data to port 11111");
 sendto(sock,
	buf, strlen(buf), 0, (struct sockaddr *)&dest1, sizeof(dest1));

 memset(buf, 0, sizeof(buf));
 snprintf(buf, sizeof(buf), "data to port 22222");
 sendto(sock,
	buf, strlen(buf), 0, (struct sockaddr *)&dest2, sizeof(dest2));

 close(sock);

 return 0;
}

�Ō��

�����ł́AUDP���g�����T���v���������܂������ATCP���g���Ă����l�̎����o���܂��B TCP�̏ꍇ�́Aaccept������̃\�P�b�g�����ł͂Ȃ��Alisten���Ă���\�P�b�g�ɑ΂���select���”\�ł��B

IPv6��b����

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