static void
fdclose(int fd)
{
  int r, retry = 0;

  if (-1 == fd) return;

restart:
  r = close(fd);
  if (-1 == r) {
    switch(errno) {
    case ENOMEM:
      _die_close(errno, fd);

    case EINTR:
      if (++retry > NPROC + 1) {
        _log_close(LOG_INFO, errno, fd);
      }
      goto restart;
    default:
      die_close(errno, fd);
    }
  }
}
示例#2
0
int main(){
    register int sock_fd, length, i, err;
    struct sockaddr_in server_addr, from_addr;
    socklen_t addr_size;
    struct pollfd pollfd;
    static char buffer[BUF_SIZE];

    sock_fd = socket(PF_INET, SOCK_DGRAM, 0);
    if(sock_fd == -1)
        die_close(127, -1, "upnp_search: Cannot create new socket");

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(UPNP_PORT);
    inet_aton(UPNP_ADDR, &(server_addr.sin_addr));

    strcpy(buffer, "M-SEARCH * HTTP/1.1\r\n"
                   "HOST: 239.255.255.250:190\r\n"
                   "MAN: \"ssdp:discover\"\r\n"
                   "MX: 2\r\n"
                   "ST: ssdp:all\r\n"
                   "\r\n");


    length = sendto(sock_fd, buffer, strlen(buffer), 0, 
                    (struct sockaddr *) &server_addr,
                    sizeof(struct sockaddr));

    if(length != strlen(buffer))
        die_close(127, sock_fd, "upnp_search: sendto() failed");

    pollfd.fd = sock_fd;
    pollfd.events = POLLIN | POLLPRI;
    i = 0;
    while(1){
        err = poll(&pollfd, 1, TIMEOUT);
        if(err < 0)
            die_close(127, sock_fd, "upnp_search(): poll() failed");
        else if(err == 0){
            if(i == 0)
                printf("<No response received.>\n");
            break;
        }
        else{
            addr_size = sizeof(struct sockaddr_in);
            length = recvfrom(sock_fd, buffer, BUF_SIZE-1, 0,
                    (struct sockaddr *)&from_addr,
                    &addr_size);

            if(length == -1)
                die_close(127, sock_fd, "upnp_search: recvfrom() failed");
            else{
                buffer[length] = '\0';
                printf("\33[1m---- Response from %s: ----\33[0m\n%s\n",
                    inet_ntoa(from_addr.sin_addr), buffer);
            }
            i = 1;
        }
    }
    close(sock_fd);
    return 0;
}