Patch net-bind.diff from http://sourceforge.net/tracker/?func=detail&aid=1682872&group_id=84903&atid=574267
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:
parent
61cea7db75
commit
6c82dc4874
7 changed files with 22 additions and 10 deletions
src
include
network
stratagus
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue