static
void
set_get(NDB_SOCKET_TYPE fd, int level, int optval, const char *optname, 
	int val)
{
  int actual = 0, defval = 0;
  SOCKET_SIZE_TYPE len = sizeof(actual);

  my_getsockopt(fd, level, optval, (char*)&defval, &len);

  if (my_setsockopt(fd, level, optval,
                    (char*)&val, sizeof(val)) < 0)
  {
#ifdef DEBUG_TRANSPORTER
    g_eventLogger->error("setsockopt(%s, %d) errno: %d %s",
                         optname, val, errno, strerror(errno));
#endif
  }
  
  len = sizeof(actual);
  if ((my_getsockopt(fd, level, optval,
                     (char*)&actual, &len) == 0) &&
      actual != val)
  {
#ifdef DEBUG_TRANSPORTER
    g_eventLogger->error("setsockopt(%s, %d) - actual %d default: %d",
                         optname, val, actual, defval);
#endif
  }
}
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
    int     n = 0;
    const   int     on = 1;
    char    sendline[MAXLINE] = {0};
    char    recvline[MAXLINE + 1] = {0};
    sigset_t   sigset_alrm;
    socklen_t   len ;
    struct  sockaddr    *preply_addr;

    preply_addr = my_malloc(servlen);       //???为什么要这个?
    my_setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
    my_signal(SIGALRM, recvfrom_alarm);
    
    my_sigemptyset(&sigset_alrm);
    my_sigaddset(&sigset_alrm, SIGALRM);

    while (my_fgets(sendline, MAXLINE, fp) != NULL)
    {
         my_sendto(sockfd, sendline, strlen(sendline),
                    0, pservaddr, servlen);

         alarm(5);

         while(1)
         {
              len = servlen;
//              DEBUG;
//              printf("recvfrom 前面!\n");
              my_sigprocmask(SIG_UNBLOCK, &sigset_alrm, NULL);
              n = recvfrom(sockfd, recvline, MAXLINE,
                            0, preply_addr, &len);
              my_sigprocmask(SIG_BLOCK, &sigset_alrm, NULL);

              if (n < 0)
              {
                   if (errno == EINTR)
                   {
                       break;
                   }
                   else
                   {
                        err_sys("recvfrom error");
                   }
              }
              else
              {
                   recvline[n] = 0;
                   sleep(1);
                   printf("from %s: %s",
                           my_sock_ntop_host(preply_addr, len),
                           recvline);
              }
         }//while
    }//while

    free(preply_addr);
}
Exemple #3
0
//p258
//执行服务器的通常步骤
int
tcp_listen(const char *host, const char *serv, socklen_t *addrlenp)
{
    int    listenfd = 0;
    int    n = 0;
    const  int         on = 1;
    struct addrinfo    hints;
    struct addrinfo    *res = NULL;
    struct addrinfo    *ressave = NULL;

    bzero(&hints, sizeof(struct addrinfo));
    hints.ai_flags     = AI_PASSIVE;
    hints.ai_family    = AF_UNSPEC;
    hints.ai_socktype  = SOCK_STREAM;

    printf("listen中!!!");
    //if n != 0, 表示error
    if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0 )
    {
        err_quit("tcp_listen error for %s, %s: %s",
                 host, serv, gai_strerror(n));
    }

    ressave = res;             //保存res

    do
    {
        //系统调用
        listenfd = socket(res->ai_family,
                          res->ai_socktype,
                          res->ai_protocol);

        if (listenfd < 0)
        {
            continue;        //error, try next one
        }

        my_setsockopt(listenfd, SOL_SOCKET,
                      SO_REUSEADDR,
                      &on, sizeof(on));

        //系统调用
        if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0)
        {
            break;       //success!
        }

        my_close(listenfd);
    } while( (res = res->ai_next) != NULL );

    if (res == NULL)
    {
        err_sys("tcp_listen error for %s, %s", host, serv);
    }

    my_listen(listenfd, LISTENQ);

    if (addrlenp)      //addrlenp是一个指针
    {
        //return size of protocal address(值结果参数)
        *addrlenp = res->ai_addrlen;
    }


    //printf("")
    struct sockaddr   test ;
    printf("ai_addr = %s\n", my_inet_ntop(AF_INET, (const char *)ressave->ai_addr, (char*)&test, sizeof(test)));


    freeaddrinfo(ressave);

    return (listenfd);
}
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
    int     n = 0;
    int     maxfdp1 = 0;
    const   int     on = 1;
    char    sendline[MAXLINE] = {0};
    char    recvline[MAXLINE] = {0};
    fd_set  rset;
    socklen_t   len;
    struct  sockaddr    *preply_addr = NULL;

    preply_addr = my_malloc(servlen);

    my_setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));

    my_pipe(pipefd);
//    printf("pipefd[0] = %d\n", pipefd[0]); //+

    maxfdp1 = max(sockfd, pipefd[0]) + 1;

    FD_ZERO(&rset);

    my_signal(SIGALRM, recvfrom_alarm);

    while (my_fgets(sendline, MAXLINE, fp) != NULL )
    {
        my_sendto(sockfd, sendline, strlen(sendline),
                  0, pservaddr, servlen);

        alarm(3);

        while (1)
        {
            FD_SET(sockfd, &rset);
            FD_SET(pipefd[0], &rset);

            if ( (n = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0 )
            {
                if (errno == EINTR)
                {
                    DEBUG;
                    printf("select errno = EINTR\n");    //+
                    continue;
                }
                else
                {
                    err_sys("select error");
                }
            }
//                printf("kankan!\n");
            if ( FD_ISSET(sockfd, &rset) )
            {
                len = servlen;
                n = my_recvfrom(sockfd, recvline, MAXLINE,
                                0, preply_addr, &len);
                recvline[n] = 0;
                printf("from %s: %s",
                       my_sock_ntop(preply_addr, len),
                       recvline);
            }

            if ( FD_ISSET(pipefd[0], &rset) )
            {
//                   printf("read 上面\n");
                my_read(pipefd[0], &n, 1);   //timer expired
//                   printf("read 下面!\n");
                break;
            }
        }
    }

    free(preply_addr);

}