示例#1
0
int
network_initialize(interrupt_handler_t network_handler)
{
    int arg = 1;
    mini_network_handler=network_handler;

    memset(&if_info, 0, sizeof(if_info));

    if_info.sock = socket(PF_INET, SOCK_DGRAM, 0);
    if (if_info.sock < 0)  {
        perror("socket");
        return -1;
    }

    if_info.sin.sin_family = SOCK_DGRAM;
    if_info.sin.sin_addr.s_addr = htonl(0);
    if_info.sin.sin_port = htons(my_udp_port);
    if (bind(if_info.sock, (struct sockaddr *) &if_info.sin,
             sizeof(if_info.sin)) < 0)  {
        /* kprintf("Error: code %ld.\n", GetLastError());*/
        AbortOnError(0);
        perror("bind");
        return -1;
    }

    /* set for fast reuse */
    assert(setsockopt(if_info.sock, SOL_SOCKET, SO_REUSEADDR,
                      (char *) &arg, sizeof(int)) == 0);

    if (BCAST_ENABLED)
        bcast_initialize(BCAST_TOPOLOGY_FILE, &topology);

    /*
     * Interrupts are handled through the caller's handler.
     */

    start_network_poll(network_handler, &if_info.sock);

    return 0;
}
int
network_initialize(interrupt_handler_t network_handler) {
  int arg = 1;

  /* initialise the NT socket library, inexplicably required by NT */
  assert(WSAStartup(MAKEWORD(2, 0), &winsock_version_data) == 0);
  
  if (atomic_test_and_set(&initialized)) {
    return -1;
  }

  memset(&if_info, 0, sizeof(if_info));
  
  if_info.sock = socket(PF_INET, SOCK_DGRAM, 0);
  if (if_info.sock < 0)  {
    perror("socket");
    return -1;
  }

  if_info.sin.sin_family = SOCK_DGRAM;
  if_info.sin.sin_addr.s_addr = htonl(0);
  if_info.sin.sin_port = htons(my_udp_port);
  if (bind(if_info.sock, (struct sockaddr *) &if_info.sin, 
	   sizeof(if_info.sin)) < 0)  {
    /* kprintf("Error: code %ld.\n", GetLastError());*/
    AbortOnError(0);
    perror("bind");
    return -1;
  }

  /* set for fast reuse */
  assert(setsockopt(if_info.sock, SOL_SOCKET, SO_REUSEADDR, 
		    (char *) &arg, sizeof(int)) == 0);

  if (BCAST_ENABLED){
    if (BCAST_USE_TOPOLOGY_FILE){
      bcast_initialize(BCAST_TOPOLOGY_FILE, &topology);
    } else {
      assert(setsockopt(if_info.sock, SOL_SOCKET, SO_BROADCAST, 
		    (char *) &arg, sizeof(int)) == 0);

      network_translate_hostname(BCAST_ADDRESS,broadcast_addr);
    }
  }

  /*
   * Print network information on the screen (mostly for Joranda).
   */

  {
    network_address_t my_address;
    char my_hostname[256];
    
    network_get_my_address(my_address);
    network_format_address(my_address, my_hostname, 256);

    kprintf("Hostname of local machine: %s.\n",my_hostname);
  }

  /*
   * Interrupts are handled through the caller's handler.
   */
  
  start_network_poll(network_handler, &if_info.sock);
    
  return 0;
}