Allow setting the address when binding the sockets - ID: 1682872

On a box with several network interface it might be desirable to bind only on a specific address.
This patch add a new command line option (-I) to do that.
This commit is contained in:
Pali Rohár 2010-08-03 15:49:33 +02:00
parent 61cea7db75
commit 6c82dc4874
7 changed files with 22 additions and 10 deletions

View file

@ -137,9 +137,9 @@ extern unsigned long NetResolveHost(const std::string &host);
/// Get local IP from network file descriptor
extern int NetSocketAddr(const Socket sock);
/// Open a UDP Socket port.
extern Socket NetOpenUDP(int port);
extern Socket NetOpenUDP(char* addr, int port);
/// Open a TCP Socket port.
extern Socket NetOpenTCP(int port);
extern Socket NetOpenTCP(char* addr, int port);
/// Close a UDP socket port.
extern void NetCloseUDP(Socket sockfd);
/// Close a TCP socket port.

View file

@ -205,6 +205,7 @@ enum _net_client_con_state_ {
extern std::string NetworkArg; /// Network command line argument
extern int NetPlayers; /// Network players
extern char* NetworkAddr; /// Local network address to use
extern int NetworkPort; /// Local network port to use
extern std::string LocalPlayerName; /// Name of local player

View file

@ -377,7 +377,7 @@ int NetSocketAddr(const Socket sock)
**
** @return If success the socket fildes, -1 otherwise.
*/
Socket NetOpenUDP(int port)
Socket NetOpenUDP(char* addr, int port)
{
Socket sockfd;
@ -392,7 +392,10 @@ Socket NetOpenUDP(int port)
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = INADDR_ANY;
if (addr)
sock_addr.sin_addr.s_addr = inet_addr(addr);
else
sock_addr.sin_addr.s_addr = INADDR_ANY;
sock_addr.sin_port = htons(port);
// Bind the socket for listening
if (bind(sockfd, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) < 0) {
@ -413,7 +416,7 @@ Socket NetOpenUDP(int port)
**
** @return If success the socket fildes, -1 otherwise
*/
Socket NetOpenTCP(int port)
Socket NetOpenTCP(char* addr, int port)
{
Socket sockfd;
@ -428,7 +431,10 @@ Socket NetOpenTCP(int port)
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = INADDR_ANY;
if (addr)
sock_addr.sin_addr.s_addr = inet_addr(addr);
else
sock_addr.sin_addr.s_addr = INADDR_ANY;
sock_addr.sin_port = htons(port);
opt = 1;

View file

@ -104,7 +104,7 @@ int MetaInit(void)
reply = NULL;
MetaServerFildes = NetworkFildes;
for (i = port_range_min; i < port_range_max; ++i) {
MetaServerFildes = NetOpenTCP(i); //FIXME: need to make a dynamic port allocation there...if (!MetaServerFildes) {...}
MetaServerFildes = NetOpenTCP(NetworkAddr, i); //FIXME: need to make a dynamic port allocation there...if (!MetaServerFildes) {...}
if (MetaServerFildes != (Socket)-1) {
if (NetConnectTCP(MetaServerFildes, NetResolveHost(MasterHost), MasterPort) != -1) {
break;

View file

@ -67,6 +67,7 @@
std::string NetworkArg; /// Network command line argument
int NetPlayers; /// How many network players
char* NetworkAddr = NULL; /// Local network address to use
int NetworkPort = NetworkDefaultPort; /// Local network port to use
#ifdef DEBUG

View file

@ -521,7 +521,7 @@ void InitNetwork1(void)
// Our communication port
port = NetworkPort;
for (i = 0; i < 10; ++i) {
NetworkFildes = NetOpenUDP(port + i);
NetworkFildes = NetOpenUDP(NetworkAddr, port + i);
if (NetworkFildes != (Socket)-1) {
break;
}

View file

@ -666,6 +666,7 @@ static void Usage(void)
\t-e\t\tStart editor\n\
\t-h\t\tHelp shows this page\n\
\t-l\t\tDisable command log\n\
\t-I addr\t\tNetwork address to use\n\
\t-P port\t\tNetwork port to use\n\
\t-n server\tNetwork server host preset\n\
\t-L lag\t\tNetwork lag in # frames (default 10 = 333ms)\n\
@ -840,9 +841,9 @@ int main(int argc, char **argv)
//
for (;;) {
#ifdef USE_MAEMO
switch (getopt(argc, argv, "c:d:ef:hln:P:s:t:v:wD:N:E:S:U:OL:o?")) {
switch (getopt(argc, argv, "c:d:ef:hln:I:P:s:t:v:wD:N:E:S:U:OL:o?")) {
#else
switch (getopt(argc, argv, "c:d:ef:hln:P:s:t:v:wD:N:E:FL:S:U:W?OL:o?")) {
switch (getopt(argc, argv, "c:d:ef:hln:I:P:s:t:v:wD:N:E:FL:S:U:W?OL:o?")) {
#endif
case 'c':
CclStartFile = optarg;
@ -865,6 +866,9 @@ int main(int argc, char **argv)
case 'l':
CommandLogDisabled = true;
continue;
case 'I':
NetworkAddr = optarg;
continue;
case 'P':
NetworkPort = atoi(optarg);
continue;