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