network_udp.c
changeset 5568 75f13d7bfaed
parent 5341 df905c2cbaae
equal deleted inserted replaced
5567:2af6b4aa2833 5568:75f13d7bfaed
   137 	// Let the client know that we are here
   137 	// Let the client know that we are here
   138 	NetworkSendUDP_Packet(_udp_server_socket, packet, client_addr);
   138 	NetworkSendUDP_Packet(_udp_server_socket, packet, client_addr);
   139 
   139 
   140 	free(packet);
   140 	free(packet);
   141 
   141 
   142 	DEBUG(net, 2)("[NET][UDP] Queried from %s", inet_ntoa(client_addr->sin_addr));
   142 	DEBUG(net, 2, "[udp] queried from '%s'", inet_ntoa(client_addr->sin_addr));
   143 }
   143 }
   144 
   144 
   145 DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE)
   145 DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_SERVER_RESPONSE)
   146 {
   146 {
   147 	extern const char _openttd_revision[];
   147 	extern const char _openttd_revision[];
   154 
   154 
   155 	game_info_version = NetworkRecv_uint8(&_udp_cs, p);
   155 	game_info_version = NetworkRecv_uint8(&_udp_cs, p);
   156 
   156 
   157 	if (_udp_cs.has_quit) return;
   157 	if (_udp_cs.has_quit) return;
   158 
   158 
   159 	DEBUG(net, 6)("[NET][UDP] Server response from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port));
   159 	DEBUG(net, 4, "[udp] server response from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port));
   160 
   160 
   161 	// Find next item
   161 	// Find next item
   162 	item = NetworkGameListAddItem(inet_addr(inet_ntoa(client_addr->sin_addr)), ntohs(client_addr->sin_port));
   162 	item = NetworkGameListAddItem(inet_addr(inet_ntoa(client_addr->sin_addr)), ntohs(client_addr->sin_port));
   163 
   163 
   164 	item->info.compatible = true;
   164 	item->info.compatible = true;
   412 }
   412 }
   413 
   413 
   414 DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_MASTER_ACK_REGISTER)
   414 DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_MASTER_ACK_REGISTER)
   415 {
   415 {
   416 	_network_advertise_retries = 0;
   416 	_network_advertise_retries = 0;
   417 	DEBUG(net, 2)("[NET][UDP] We are advertised on the master-server!");
   417 	DEBUG(net, 2, "[udp] advertising on master server successfull");
   418 
   418 
   419 	if (!_network_advertise) {
   419 	/* We are advertised, but we don't want to! */
   420 		/* We are advertised, but we don't want to! */
   420 	if (!_network_advertise) NetworkUDPRemoveAdvertise();
   421 		NetworkUDPRemoveAdvertise();
       
   422 	}
       
   423 }
   421 }
   424 
   422 
   425 /**
   423 /**
   426  * A client has requested the names of some NewGRFs.
   424  * A client has requested the names of some NewGRFs.
   427  *
   425  *
   446 	uint packet_len = 0;
   444 	uint packet_len = 0;
   447 
   445 
   448 	/* Just a fail-safe.. should never happen */
   446 	/* Just a fail-safe.. should never happen */
   449 	if (_udp_cs.has_quit) return;
   447 	if (_udp_cs.has_quit) return;
   450 
   448 
   451 	DEBUG(net, 6)("[NET][UDP] NewGRF data request from %s:%d", inet_ntoa(client_addr->sin_addr), ntohs(client_addr->sin_port));
   449 	DEBUG(net, 6, "[udp] newgrf data request from %s:%d", inet_ntoa(client_addr->sin_addr), ntohs(client_addr->sin_port));
   452 
   450 
   453 	num_grfs = NetworkRecv_uint8 (&_udp_cs, p);
   451 	num_grfs = NetworkRecv_uint8 (&_udp_cs, p);
   454 	if (num_grfs > NETWORK_MAX_GRF_COUNT) return;
   452 	if (num_grfs > NETWORK_MAX_GRF_COUNT) return;
   455 
   453 
   456 	for (i = 0; i < num_grfs; i++) {
   454 	for (i = 0; i < num_grfs; i++) {
   500 	uint i;
   498 	uint i;
   501 
   499 
   502 	/* Just a fail-safe.. should never happen */
   500 	/* Just a fail-safe.. should never happen */
   503 	if (_udp_cs.has_quit) return;
   501 	if (_udp_cs.has_quit) return;
   504 
   502 
   505 	DEBUG(net, 6)("[NET][UDP] NewGRF data reply from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port));
   503 	DEBUG(net, 6, "[udp] newgrf data reply from %s:%d", inet_ntoa(client_addr->sin_addr),ntohs(client_addr->sin_port));
   506 
   504 
   507 	num_grfs = NetworkRecv_uint8 (&_udp_cs, p);
   505 	num_grfs = NetworkRecv_uint8 (&_udp_cs, p);
   508 	if (num_grfs > NETWORK_MAX_GRF_COUNT) return;
   506 	if (num_grfs > NETWORK_MAX_GRF_COUNT) return;
   509 
   507 
   510 	for (i = 0; i < num_grfs; i++) {
   508 	for (i = 0; i < num_grfs; i++) {
   564 
   562 
   565 	if (type < PACKET_UDP_END && _network_udp_packet[type] != NULL && !_udp_cs.has_quit) {
   563 	if (type < PACKET_UDP_END && _network_udp_packet[type] != NULL && !_udp_cs.has_quit) {
   566 		_network_udp_packet[type](p, client_addr);
   564 		_network_udp_packet[type](p, client_addr);
   567 	} else {
   565 	} else {
   568 		if (!_udp_cs.has_quit) {
   566 		if (!_udp_cs.has_quit) {
   569 			DEBUG(net, 0)("[NET][UDP] Received invalid packet type %d", type);
   567 			DEBUG(net, 0, "[udp] received invalid packet type %d", type);
   570 		} else {
   568 		} else {
   571 			DEBUG(net, 0)("[NET][UDP] Received illegal packet");
   569 			DEBUG(net, 0, "[udp] received illegal packet");
   572 		}
   570 		}
   573 	}
   571 	}
   574 }
   572 }
   575 
   573 
   576 
   574 
   584 	p->buffer[1] = p->size >> 8;
   582 	p->buffer[1] = p->size >> 8;
   585 
   583 
   586 	// Send the buffer
   584 	// Send the buffer
   587 	res = sendto(udp, p->buffer, p->size, 0, (struct sockaddr *)recv, sizeof(*recv));
   585 	res = sendto(udp, p->buffer, p->size, 0, (struct sockaddr *)recv, sizeof(*recv));
   588 
   586 
   589 	// Check for any errors, but ignore it for the rest
   587 	// Check for any errors, but ignore it otherwise
   590 	if (res == -1) {
   588 	if (res == -1) DEBUG(net, 1, "[udp] sendto failed with: %i", GET_LAST_ERROR());
   591 		DEBUG(net, 1)("[NET][UDP] Send error: %i", GET_LAST_ERROR());
       
   592 	}
       
   593 }
   589 }
   594 
   590 
   595 // Start UDP listener
   591 // Start UDP listener
   596 bool NetworkUDPListen(SOCKET *udp, uint32 host, uint16 port, bool broadcast)
   592 bool NetworkUDPListen(SOCKET *udp, uint32 host, uint16 port, bool broadcast)
   597 {
   593 {
   600 	// Make sure socket is closed
   596 	// Make sure socket is closed
   601 	closesocket(*udp);
   597 	closesocket(*udp);
   602 
   598 
   603 	*udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
   599 	*udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
   604 	if (*udp == INVALID_SOCKET) {
   600 	if (*udp == INVALID_SOCKET) {
   605 		DEBUG(net, 1)("[NET][UDP] Failed to start UDP support");
   601 		DEBUG(net, 0, "[udp] failed to start UDP listener");
   606 		return false;
   602 		return false;
   607 	}
   603 	}
   608 
   604 
   609 	// set nonblocking mode for socket
   605 	// set nonblocking mode for socket
   610 	{
   606 	{
   620 	// Listen on all IPs
   616 	// Listen on all IPs
   621 	sin.sin_addr.s_addr = host;
   617 	sin.sin_addr.s_addr = host;
   622 	sin.sin_port = htons(port);
   618 	sin.sin_port = htons(port);
   623 
   619 
   624 	if (bind(*udp, (struct sockaddr*)&sin, sizeof(sin)) != 0) {
   620 	if (bind(*udp, (struct sockaddr*)&sin, sizeof(sin)) != 0) {
   625 		DEBUG(net, 1) ("[NET][UDP] error: bind failed on %s:%i", inet_ntoa(*(struct in_addr *)&host), port);
   621 		DEBUG(net, 0, "[udp] bind failed on %s:%i", inet_ntoa(*(struct in_addr *)&host), port);
   626 		return false;
   622 		return false;
   627 	}
   623 	}
   628 
   624 
   629 	if (broadcast) {
   625 	if (broadcast) {
   630 		/* Enable broadcast */
   626 		/* Enable broadcast */
   632 #ifndef BEOS_NET_SERVER // will work around this, some day; maybe.
   628 #ifndef BEOS_NET_SERVER // will work around this, some day; maybe.
   633 		setsockopt(*udp, SOL_SOCKET, SO_BROADCAST, (char *) &val , sizeof(val));
   629 		setsockopt(*udp, SOL_SOCKET, SO_BROADCAST, (char *) &val , sizeof(val));
   634 #endif
   630 #endif
   635 	}
   631 	}
   636 
   632 
   637 	DEBUG(net, 1)("[NET][UDP] Listening on port %s:%d", inet_ntoa(*(struct in_addr *)&host), port);
   633 	DEBUG(net, 1, "[udp] listening on port %s:%d", inet_ntoa(*(struct in_addr *)&host), port);
   638 
   634 
   639 	return true;
   635 	return true;
   640 }
   636 }
   641 
   637 
   642 // Close UDP connection
   638 // Close UDP connection
   643 void NetworkUDPClose(void)
   639 void NetworkUDPClose(void)
   644 {
   640 {
   645 	DEBUG(net, 1) ("[NET][UDP] Closed listeners");
   641 	DEBUG(net, 1, "[udp] closed listeners");
   646 
   642 
   647 	if (_network_udp_server) {
   643 	if (_network_udp_server) {
   648 		if (_udp_server_socket != INVALID_SOCKET) {
   644 		if (_udp_server_socket != INVALID_SOCKET) {
   649 			closesocket(_udp_server_socket);
   645 			closesocket(_udp_server_socket);
   650 			_udp_server_socket = INVALID_SOCKET;
   646 			_udp_server_socket = INVALID_SOCKET;
   713 
   709 
   714 		out_addr.sin_family = AF_INET;
   710 		out_addr.sin_family = AF_INET;
   715 		out_addr.sin_port = htons(_network_server_port);
   711 		out_addr.sin_port = htons(_network_server_port);
   716 		out_addr.sin_addr.s_addr = _broadcast_list[i];
   712 		out_addr.sin_addr.s_addr = _broadcast_list[i];
   717 
   713 
   718 		DEBUG(net, 6)("[NET][UDP] Broadcasting to %s", inet_ntoa(out_addr.sin_addr));
   714 		DEBUG(net, 4, "[udp] broadcasting to %s", inet_ntoa(out_addr.sin_addr));
   719 
   715 
   720 		NetworkSendUDP_Packet(udp, p, &out_addr);
   716 		NetworkSendUDP_Packet(udp, p, &out_addr);
   721 	}
   717 	}
   722 
   718 
   723 	free(p);
   719 	free(p);
   743 	// packet only contains protocol version
   739 	// packet only contains protocol version
   744 	NetworkSend_uint8(p, NETWORK_MASTER_SERVER_VERSION);
   740 	NetworkSend_uint8(p, NETWORK_MASTER_SERVER_VERSION);
   745 
   741 
   746 	NetworkSendUDP_Packet(_udp_client_socket, p, &out_addr);
   742 	NetworkSendUDP_Packet(_udp_client_socket, p, &out_addr);
   747 
   743 
   748 	DEBUG(net, 2)("[NET][UDP] Queried Master Server at %s:%d", inet_ntoa(out_addr.sin_addr),ntohs(out_addr.sin_port));
   744 	DEBUG(net, 2, "[udp] master server queried at %s:%d", inet_ntoa(out_addr.sin_addr),ntohs(out_addr.sin_port));
   749 
   745 
   750 	free(p);
   746 	free(p);
   751 }
   747 }
   752 
   748 
   753 // Find all servers
   749 // Find all servers
   754 void NetworkUDPSearchGame(void)
   750 void NetworkUDPSearchGame(void)
   755 {
   751 {
   756 	// We are still searching..
   752 	// We are still searching..
   757 	if (_network_udp_broadcast > 0)
   753 	if (_network_udp_broadcast > 0) return;
   758 		return;
       
   759 
   754 
   760 	// No UDP-socket yet..
   755 	// No UDP-socket yet..
   761 	if (_udp_client_socket == INVALID_SOCKET)
   756 	if (_udp_client_socket == INVALID_SOCKET)
   762 		if (!NetworkUDPListen(&_udp_client_socket, 0, 0, true))
   757 		if (!NetworkUDPListen(&_udp_client_socket, 0, 0, true))
   763 			return;
   758 			return;
   764 
   759 
   765 	DEBUG(net, 0)("[NET][UDP] Searching server");
   760 	DEBUG(net, 0, "[udp] searching server");
   766 
   761 
   767 	NetworkUDPBroadCast(_udp_client_socket);
   762 	NetworkUDPBroadCast(_udp_client_socket);
   768 	_network_udp_broadcast = 300; // Stay searching for 300 ticks
   763 	_network_udp_broadcast = 300; // Stay searching for 300 ticks
   769 }
   764 }
   770 
   765 
   806 {
   801 {
   807 	struct sockaddr_in out_addr;
   802 	struct sockaddr_in out_addr;
   808 	Packet *p;
   803 	Packet *p;
   809 
   804 
   810 	/* Check if we are advertising */
   805 	/* Check if we are advertising */
   811 	if (!_networking || !_network_server || !_network_udp_server)
   806 	if (!_networking || !_network_server || !_network_udp_server) return;
   812 		return;
       
   813 
   807 
   814 	/* check for socket */
   808 	/* check for socket */
   815 	if (_udp_master_socket == INVALID_SOCKET)
   809 	if (_udp_master_socket == INVALID_SOCKET)
   816 		if (!NetworkUDPListen(&_udp_master_socket, _network_server_bind_ip, 0, false))
   810 		if (!NetworkUDPListen(&_udp_master_socket, _network_server_bind_ip, 0, false))
   817 			return;
   811 			return;
   818 
   812 
   819 	DEBUG(net, 2)("[NET][UDP] Removing advertise..");
   813 	DEBUG(net, 1, "[udp] removing advertise from master server");
   820 
   814 
   821 	/* Find somewhere to send */
   815 	/* Find somewhere to send */
   822 	out_addr.sin_family = AF_INET;
   816 	out_addr.sin_family = AF_INET;
   823 	out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT);
   817 	out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT);
   824 	out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST);
   818 	out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST);
   870 	/* Find somewhere to send */
   864 	/* Find somewhere to send */
   871 	out_addr.sin_family = AF_INET;
   865 	out_addr.sin_family = AF_INET;
   872 	out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT);
   866 	out_addr.sin_port = htons(NETWORK_MASTER_SERVER_PORT);
   873 	out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST);
   867 	out_addr.sin_addr.s_addr = NetworkResolveHost(NETWORK_MASTER_SERVER_HOST);
   874 
   868 
   875 	DEBUG(net, 1)("[NET][UDP] Advertising to master server");
   869 	DEBUG(net, 1, "[udp] advertising to master server");
   876 
   870 
   877 	/* Send the packet */
   871 	/* Send the packet */
   878 	p = NetworkSend_Init(PACKET_UDP_SERVER_REGISTER);
   872 	p = NetworkSend_Init(PACKET_UDP_SERVER_REGISTER);
   879 	/* Packet is: WELCOME_MESSAGE, Version, server_port */
   873 	/* Packet is: WELCOME_MESSAGE, Version, server_port */
   880 	NetworkSend_string(p, NETWORK_MASTER_SERVER_WELCOME_MESSAGE);
   874 	NetworkSend_string(p, NETWORK_MASTER_SERVER_WELCOME_MESSAGE);