UDP併発サーバーモデル二:selectメカニズム

4204 ワード

前の文章は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); } }