UDP併発サーバーモデル二:selectメカニズム
前の文章はudpの合併モデルを言いました.そして、筆者も自分でコードを作成しました.基本的には同時にメカニズムを表示することができます.大体の原理の参考:http://blog.csdn.net/aa120515692/article/details/47294335
select IO 。 , select
主要関数インターフェース:void listen_head_init(struct list_head *head)
int listen_add(struct list_head *head, listen_t *listen)
listen
recv_from_listen_head
例: // listen_head
struct list_head poll_head_1, poll_head_2;
int main(int argc, char *argv[])
{
int poll_num = 0;
struct listen *_listen;
/* socket */
sockfd = init_socket();
/*
socket. 10
TCP int listen(SOCKET sockfd, int backlog)
*/
server_listen(&sockfd, 10);
/* poll */
listen_head_init(&poll_head_1);
listen_head_init(&poll_head_2);
while(1)
{
/* 。 TCP
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
*/
_listen = server_accept();
if(_listen == NULL){
continue;
}
printf("new client \r
");
if(poll_num < 5)
{
/* poll_head_1 */
poll_num ++;
listen_add(&poll_head_1, _listen);
}else{
/* poll_head_2 */
poll_num ++;
listen_add(&poll_head_2, _listen);
}
}
}
listen_head
while(1)
{
/*
poll_head_1 。
, listen poll_head_1, listen
recv_from_listen_head , _listen listen
, listen
*/
ret = recv_from_listen_head(poll_head_1, &_listen, (struct sockaddr *)&clientaddr, buf, 1204, -1);
if(ret == -1)
{
printf("%p recv is err \r
", _listen);
}else{
printf("__ poll %p recv %d byte data is [%s]\r
", _listen, ret, buf);
if((ret = sendto(sockfd, buf, ret, 0, (struct sockaddr *)(&(_listen->addr)),
sizeof(struct sockaddr))) == -1)
{
perror("sendto :");
}
printf("sento [%s]\r
", buf);
}
}