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; }